GUID
Overview
このガイドでは、グローバルにユニークな識別子(GUID)(これはユニバーサル一意識別子 (UUID)とも呼ばれます)をシリアル化する方法を学びます。
Tip
ObjectId
MongoDB アプリケーションでは、ObjectId 型をドキュメントの一意な識別子として使用できます。可能な場合は、MongoDB アプリケーションで GUID の代わりに ObjectId
インスタンスを使用することを検討してください。
MongoDB の GUID
GUID は 16 バイトの整数で、MongoDB ドキュメントのユニークな ID として使用できます。次のコード ブロックは、GUID の例を示しています。
00112233-4455-6677-8899-aabbccddeeff
元々、MongoDB は GUID をサブタイプ 3 の BsonBinaryData
値として表現していました。サブタイプ 3 ではエンコード時に GUID のバイト順が標準化されなかったため、さまざまな MongoDB ドライバーで GUID が異なるバイト順でエンコードされました。
次のタブには、前述の GUID から BsonBinaryData
サブタイプ 3 へのさまざまなドライバー エンコーディングが表示されます。
33221100-5544-7766-8899-aabbccddeeff
00112233-4455-6677-8899-aabbccddeeff
77665544-3322-1100-ffee-ddccbbaa9988
アプリケーション間で GUID バイト順序を標準化するために、すべてのMongoDBドライバーが同じ方法でエンコードする BsonBinaryData
サブタイプ 4 を追加しました。アプリケーションで GUID を使用する場合は、BsonBinaryData
サブタイプ 4 を使用して保存することをお勧めします。
全 BsonBinaryData
サブタイプの一覧については、 BsonBinarySubType 列挙型のAPIドキュメントを参照してください。
GUID の直列化
すべての新しい BsonBinaryData
GUID にサブタイプ 4 を使用することを推奨していますが、古い MongoDB コレクションには、サブタイプ 3 を使用する GUID フィールドとサブタイプ 4 を使用する GUID フィールドが含まれている場合があります。これらの違いを考慮するために、.NET/C# ドライバーは個々のプロパティのレベルで GUID 直列化を処理します。
.NET/C# ドライバーは GuidRepresentation
列挙型を使用してさまざまな BsonBinaryData
サブタイプを表します。次の表は、GuidRepresentation
列挙メンバーと、それに対応する BsonBinaryData
サブタイプを示しています。
GuidRepresentation メンバー | BsonBinaryData サブタイプ |
---|---|
| 4 |
| 3 |
| 3 |
| 3 |
| 該当なし |
注意
CSharpLegacy
、JavaLegacy
、PythonLegacy
GUID 表現はすべて BsonBinaryData
サブタイプ 3 と同じですが、使用するバイト順が異なります。
次のセクションでは、アプリケーションで GUID 表現を構成する方法について説明します。
属性を使用した構成
.NET/ C#ドライバーを使用して がC#クラスをドキュメントスキーマに自動マップピングする BsonGuidRepresentation
場合は、GUIDプロパティに 属性を追加して、その属性を指定できます。この属性は、 GuidRepresentation列挙からの値を受け入れます。
次のコード例では、G
プロパティの Standard
GUID 表現を指定しています。
public class Widget { public int Id { get; set; } [ ] public Guid G { get; set; } }
コードでの構成
独自の直列化コードを作成する場合は、GuidSerializer
クラスを使用して個々の GUID 値を BSON フィールドとの間で直列化および逆直列化できます。ドライバーで GUID を正しく処理できるようにするには、 GuidSerializer
を構築するときに GuidRepresentation
パラメーターを使用します。
次のコードサンプルは、BsonBinaryData
サブタイプ 4 を使用するプロパティを直列化するために GuidSerializer
クラスのインスタンスを作成します。
var guidSerializer = new GuidSerializer(GuidRepresentation.Standard);
ほとんどの GUID が同じ表現を使用する場合は、 GuidSerializer
をグローバルに登録できます。GuidSerializer
を作成して登録するには、ブートストラップ フェーズなど、アプリケーションの早い段階で次のコードを実行します。
BsonSerializer.RegisterSerializer(new GuidSerializer(GuidRepresentation.Standard));
Tip
2 つの BsonBinaryData
サブタイプを扱う場合は、グローバル シリアライザーをBsonGuidRepresentation
プロパティ属性と組み合わせることができます。たとえば、最も一般的に使用される GUID サブタイプのグローバル シリアライザーを登録し、BsonGuidRepresentation
属性を使用して別のサブタイプの GUID プロパティを示すことができます。
重要
シリアライザーをグローバルに登録しない場合は、直列化可能なすべてのGUIDプロパティに BsonGuidRepresentation
属性を適用する必要があります。それ以外の場合、ドライバーはプロパティを直列化しようとしたときに例外をスローします。
オブジェクトの直列化
ObjectSerializer
を使用して、階層オブジェクトをサブドキュメントに直列化できます。これらのオブジェクト内の GUID を正しく直列化および逆直列化するには、ObjectSerializer
の構築時に正しい GUID 表現を選択します。
次のコード サンプルは、サブタイプ 4 の GUID 表現の ObjectSerializer
を作成する方法を示しています。
var objectDiscriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeof(object)); var objectSerializer = new ObjectSerializer(objectDiscriminatorConvention, GuidRepresentation.Standard);
アプリケーションで ObjectSerializer
を使用して GUID を直列化する場合は、アプリケーションの早い段階(ブートストラップ段階など)でもシリアライザーを登録する必要があります。登録したシリアライザーは、オブジェクト シリアライザーが必要で、特に指定されていない場合は常にグローバルに使用されます。
ObjectSerializer
を登録するには、BsonSerializer.RegisterSerializer()
メソッドに渡します。
var objectDiscriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeof(object)); var objectSerializer = new ObjectSerializer(objectDiscriminatorConvention, GuidRepresentation.Standard); BsonSerializer.RegisterSerializer(objectSerializer);
詳細情報
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。