Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
C#/.NET ドライバー

直列化

このガイドでは、MongoDB .NET/C# ドライバーを使用して直列化を実行する方法を学習できます。 直列化は、C# オブジェクトを MongoDB にストレージ用の BSON ドキュメントにマッピングするプロセスです。

Tip

直列化

直列化の詳細については、 直列化 を参照してください Wikipedia の記事。

シリアライザーは、C# オブジェクトと BSON ドキュメントの変換を処理するクラスです。 シリアライザーは IBsonSerializerインターフェースを実装します。 .NET/C# ドライバーには、プリミティブ型、コレクション型、カスタム クラスを処理するために作成された多数の組み込みシリアライザーがあります。

使用可能なシリアライザーの完全なリストについては、「 シリアライザーの名前空間 API ドキュメント 」を参照してください。

ObjectSerializerクラスでは、安全であると見なされる型の直列化と逆直列化のみが許可されます。ObjectSerializer を構築する際、Func<Type, bool> タイプの委任を渡すことができます。この委任はオブジェクトタイプを受け入れ、そのタイプが直列化に安全かどうかを示すブール値値を返します。

ほとんどの場合、ObjectSerializer.DefaultAllowedTypes() 委任を渡します。このメソッドは、安全であると判断したいくつかの既知のフレームワークタイプに対して true を返します。カスタムタイプをシリアル化するには、含めるタイプに対して true と評価されるブール値の式を作成します。次に、この式をObjectSerializer コンストラクターに渡す委任の末尾に追加します。

次の例では、 ObjectSerializerは、 ObjectSerializer.DefaultAllowedTypes()によって許可されているタイプ、またはフル名が"MyNamespace"で始まるタイプを直列化および逆直列化します。

var objectSerializer = new ObjectSerializer(type => ObjectSerializer.DefaultAllowedTypes(type)
|| type.FullName.StartsWith("MyNamespace"));
BsonSerializer.RegisterSerializer(objectSerializer);

匿名型をシリアル化するには、次の例に示すように、ブール値type.FullName.StartsWith("<>f__AnonymousType"))を削除に追加します。

var objectSerializer = new ObjectSerializer(type => ObjectSerializer.DefaultAllowedTypes(type)
|| type.FullName.StartsWith("<>f__AnonymousType"));
BsonSerializer.RegisterSerializer(objectSerializer);

他の操作を行う前に、プログラムの開始時に ObjectSerializer を作成して登録します。

シリアライザー レジストリには、アプリケーションで使用できるすべての登録済みシリアライザーが含まれます。 組み込みシリアライザーの多くは、アプリケーションの起動時にシリアライザー レジストリに自動的に登録されます。 ただし、カスタム シリアライザーを使用する前に、次の例に示すように、それをシリアライザー レジストリに追加する必要があります。

BsonSerializer.RegisterSerializer(new CustomTypeSerializer());

シリアライザー レジストリにアクセスするには、次のようにBsonSerializerクラスのSerializerRegistryプロパティを使用します。

var intSerializer = BsonSerializer.SerializerRegistry.GetSerializer<int>();

重要

シリアライザー レジストリはグローバル レジストリです。 つまり、1 つのアプリケーションで複数のレジストリを使用することはできません。

独自のカスタム シリアライザーを作成するには、IBsonSerializer 基本クラスを実装し、ValueType メンバーを設定して、Deserialize() メソッドと Serialize() メソッドをオーバーライドします。

次のコード例は、カスタムBsonRegularExpressionシリアライザーを示しています。

class CustomRegularExpressionSerializer : IBsonSerializer
{
public Type ValueType => typeof(Regex);
public object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var type = context.Reader.CurrentBsonType;
switch (type)
{
case BsonType.RegularExpression:
return context.Reader.ReadRegularExpression().AsRegex;
case BsonType.String:
var pattern = context.Reader.ReadString()
return new Regex(pattern);
default:
throw new NotSupportedException($"Cannot convert a {type} to a RegularExpression.");
}
}
public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
{
var regex = (Regex) value;
context.Writer.WriteRegularExpression(regex);
}
}

.NET/C# ドライバーには、シリアライザーが取り扱うデータ型に応じて、カスタム シリアライザー クラスで実装できるオプションのインターフェースがいくつかあります。

IBsonIdProvider インターフェースは メソッドとGetDocumentId() SetDocumentId()メソッドを提供し、シリアル化するオブジェクトが_id 以外のObjectId タイプを使用する場合に便利です。

IBsonDocumentSerializer の実装 インターフェースを使用すると、ドライバーはシリアル化されているオブジェクトのノード情報にアクセスできます。これにより、ドライバーはカスタム シリアライザーを使用するときに型セーフなクエリを適切に構築できます。

IBsonArraySerializer の実装 インターフェースにより、ドライバーは配列内の個々の項目の直列化情報にアクセスできます。

<T><T>標準のC#配列やBsonArray オブジェクトなどのタイプを使用する代わりに、プリミティブの配列を メモリ未満ドライバーは、Memory<T>ReadOnlyMemory<T> に対して高速直列化および逆直列化パスを実装することで、速度を向上させ、メモリ使用量を削減します。

注意

切り捨てとオーバーフロー チェックは Memory<T> または ReadOnlyMemory<T> ではサポートされていませんが、これらのチェックは標準配列に実装されています。

これらのパフォーマンス向上は、Memory<T> または ReadOnlyMemory<T> 構造体に次のプリミティブ型を保存することで実現できます。

  • bool

  • sbyte

  • byte

  • char

  • short

  • ushort

  • int

  • uint

  • long

  • ulong

  • float

  • double

  • decimal

次の例では、Memory 構造体と ReadOnlyMemory 構造体によってモデル化された配列フィールドを含む Line POCO を定義します。

public class Line
{
public ObjectId Id { get; set; }
public Memory<int> X { get; set; }
public ReadOnlyMemory<float> Y { get; set; }
}

次のドキュメントは、サンプルLineオブジェクトがMongoDBでどのように表されているかを表しています。

{
"_id": ...,
"X": [ 1, 2, 3, 4, 5 ],
"Y": [ 1, 1.409999966621399, 1.7300000190734863, 2, 2.240000009536743 ]
}

.NET/C# ドライバーを使用して C# オブジェクトを直列化する方法の詳細については、次のページを参照してください。

  • クラスマッピング

  • POCO

  • 多形オブジェクト

  • GUID

このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。

戻る

TLS/SSL

項目一覧