GUID
Overview
このガイドでは、グローバルにユニークな識別子(GUID)(これはユニバーサル一意識別子 (UUID)とも呼ばれます)をシリアル化する方法を学びます。
Tip
MongoDB アプリケーションでは、 ObjectId
をドキュメントのユニークな識別子として使用できます。可能な場合は、MongoDB アプリケーションで GUID の代わりに ObjectId
を使用することを検討してください。
GUID は 16 バイトの整数で、MongoDB ドキュメントのユニークな ID として使用できます。MongoDB の GUID は元々、サブタイプ 3 の BsonBinaryData
値として表されていました。サブタイプ 3 では直列化の間にバイト順序が標準化されなかったため、MongoDB ドライバー間で直列化に一貫性がありませんでした。バイト順序を標準化し、ドライバー間で一貫した直列化を実現するため、BsonBinaryData
サブタイプ 4 を開発しました。
注意
すべての新しい GUID にBsonBinaryData
サブタイプ 4 を使用します。
GuidRepresentationMode
多くの MongoDB コレクションでは、すべての GUID フィールドが同じサブタイプ BsonBinaryData
を使用しています。ただし、一部の古いコレクションには、サブタイプ 3 を使用する GUID フィールドとサブタイプ 4 を使用する GUID フィールドが含まれている場合があります。ドライバーですべての GUID を正しく直列化および逆直列化できるようにするには、 BsonDefaults.GuidRepresentationMode
プロパティを次の GuidRepresentationMode
値のいずれかに設定する必要があります。
V2
GuidRepresentationMode.V2
では、ドキュメント内のすべての GUID が同じ BsonBinaryData
サブタイプを使用することを想定します。このモードでは、GUID 表現はシリアライザーではなく、リーダーまたはライターによって制御されます。
V2
がデフォルトの GuidRepresentationMode
です。
注意
.NET/C# ドライバーのバージョン 3 がリリースされると、 GuidRepresentationMode.V2
のサポートはドライバーから削除され、 V3
がデフォルトになります。
V3
GuidRepresentationMode.V3
により、同じドキュメント内のフィールドで異なる GUID 形式を使用できるようになります。このモードでは、GUID 表現は、各プロパティのシリアライザーを構成することによって、プロパティ レベルで制御されます。
GuidRepresentationMode.V3
を使用するには、次のコード行を実行します。MongoClient
オブジェクトを作成する前に、アプリケーションのブートストラップ フェーズでこのコードを実行する必要があります。
BsonDefaults.GuidRepresentationMode = GuidRepresentationMode.V3;
V3
モードで実行すると、ドライバーの動作が次のように変わります。
BsonBinaryReader.ReadBinaryData()
メソッドはreaderSettings.GuidRepresentation
を無視します。BsonBinaryWriter.WriteBinaryData()
メソッドはwriterSettings.GuidRepresentation
を無視します。JsonReader.ReadBinaryData()
メソッドはreaderSettings.GuidRepresentation
を無視します。JsonWriter
ignoreswriterSettings.GuidRepresentation
GuidRepresentation
パラメータなしでBsonBinaryData.ToGuid()
メソッドを呼び出す方法は、サブタイプ 4 の GUID に対してのみ機能します。
注意
1 つのアプリケーションで GuidRepresentationMode.V2
と GuidRepresentationMode.V3
両方を使用することはできません。
V3 における GUID の直列化
GuidRepresentationMode.V3
は、GUID の直列化を個々のプロパティのレベルで処理します。このモードは V2
よりも柔軟ですが、各 GUID フィールドが正しく直列化および逆直列化されていることを確認する必要があります。
.NET/C# ドライバーを使用してC# クラスをドキュメント スキーマに自動的にマッピングする場合は、GUID プロパティのBsonGuidRepresentation
属性を使用して表現を指定できます。
public class Widget { public int Id { get; set; } [ ] public Guid G { get; set; } }
注意
GuidRepresentation.Standard
は BsonBinaryData
サブタイプ 4 に相当します。.NET/C# ドライバーのその他の GUID 表現( CSharpLegacy
、 JavaLegacy
、 PythonLegacy
など)はサブタイプ 3 と同じですが、使用するバイト順が異なります。
独自の直列化コードを作成する場合は、GuidSerializer
クラスを使用して個々の GUID 値を BSON フィールドとの間で直列化および逆直列化できます。ドライバーで GUID を正しく処理できるようにするには、 GuidSerializer
を構築するときに GuidRepresentation
パラメーターを使用します。
次のコード サンプルでは、サブタイプ 4 の GUID 表現を直列化するための GuidSerializer
のインスタンスを作成します。
var guidSerializer = new GuidSerializer(GuidRepresentation.Standard);
ほとんどの GUID が同じ表現を使用する場合は、 GuidSerializer
をグローバルに登録できます。GuidSerializer
を作成して登録するには、ブートストラップ フェーズなど、アプリケーションの早い段階で次のコードを実行します。
BsonSerializer.RegisterSerializer(new GuidSerializer(GuidRepresentation.Standard));
Tip
2 つのサブタイプを扱う場合は、グローバル シリアライザーを BsonGuidRepresentation
プロパティ属性と組み合わせることができます。たとえば、最も一般的に使用される GUID サブタイプのグローバル シリアライザーを登録し、 BsonGuidRepresentation
属性を使用して別のサブタイプの GUID プロパティを示すことができます。
V3 におけるオブジェクトの直列化
ObjectSerializer
を使用して、階層オブジェクトをサブドキュメントに直列化できます。V3
を使用するときにこれらのオブジェクト内の 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 ドキュメントを参照してください。