GUID
Overview
このガイドでは、グローバルにユニークな識別子(GUID)(これはユニバーサル一意識別子 (UUID)とも呼ばれます)を直列化する方法を学びます。
Tip
ObjectId
MongoDBアプリケーションでは、 ObjectId を使用できます ドキュメントの一意の識別子としての 型。可能な場合は、ObjectId
MongoDBアプリケーションで GUID の代わりに インスタンスを使用することを検討してください。
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 サブタイプ |
---|---|
Standard | 4 |
CSharpLegacy | 3 |
JavaLegacy | 3 |
PythonLegacy | 3 |
Unspecified | 該当なし |
注意
CSharpLegacy
、 JavaLegacy
、 PythonLegacy
GUID 表現はすべてBsonBinaryData
サブタイプ3と同じですが、使用するバイト順が異なります。
次のセクションでは、アプリケーションで GUID 表現を構成する方法について説明します。
属性を使用した構成
.NET/ C#ドライバーを使用してがC#クラスをドキュメントスキーマに自動マップピングする場合は、GUIDプロパティにBsonGuidRepresentation
属性を追加して、その属性を指定できます。この属性は、次からの値を受け入れます:
次のコード例では、 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 ドキュメントを参照してください。