Docs Menu
Docs Home
/ / /
C#/.NET
/ /

GUID

項目一覧

  • Overview
  • MongoDB の GUID
  • GUID の直列化
  • 属性を使用した構成
  • コードでの構成
  • オブジェクトの直列化
  • 詳細情報

このガイドでは、グローバルにユニークな識別子GUID)(これはユニバーサル一意識別子 (UUID)とも呼ばれます)をシリアル化する方法を学びます。

Tip

ObjectId

MongoDB アプリケーションでは、ObjectId 型をドキュメントの一意な識別子として使用できます。可能な場合は、MongoDB アプリケーションで GUID の代わりに ObjectId インスタンスを使用することを検討してください。

GUID は 16 バイトの整数で、MongoDB ドキュメントのユニークな ID として使用できます。次のコード ブロックは、GUID の例を示しています。

00112233-4455-6677-8899-aabbccddeeff

元々、MongoDB は GUID をサブタイプ 3BsonBinaryData 値として表現していました。サブタイプ 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ドキュメントを参照してください。

すべての新しい 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

該当なし

注意

CSharpLegacyJavaLegacyPythonLegacy GUID 表現はすべて BsonBinaryData サブタイプ 3 と同じですが、使用するバイト順が異なります。

次のセクションでは、アプリケーションで GUID 表現を構成する方法について説明します。

.NET/ C#ドライバーを使用して がC#クラスをドキュメントスキーマに自動マップピングする BsonGuidRepresentation場合は、GUIDプロパティに 属性を追加して、その属性を指定できます。この属性は、 GuidRepresentation列挙からの値を受け入れます。

次のコード例では、G プロパティの Standard GUID 表現を指定しています。

public class Widget
{
public int Id { get; set; }
[BsonGuidRepresentation(GuidRepresentation.Standard)]
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 ドキュメントを参照してください。

戻る

多形オブジェクト