Overview
このガイドでは、汎用一意の識別子(UUID)とも呼ばれる、グローバル 一意の識別子( GUID )を直列化する方法を学習できます。
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を無視します。JsonWriterignoreswriterSettings.GuidRepresentationGuidRepresentationパラメータなしで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 ドキュメントを参照してください。