Overview
このガイドでは、MongoDB .NET/C# ドライバーを使用して直列化を実行する方法を学習できます。 直列化は、C# オブジェクトを MongoDB にストレージ用の BSON ドキュメントにマッピングするプロセスです。
シリアライザー
シリアライザーは、C# オブジェクトと BSON ドキュメントの変換を処理するクラスです。 シリアライザーは IBsonSerializer
インターフェースを実装します。 .NET/C# ドライバーには、プリミティブ型、コレクション型、カスタム クラスを処理するために作成された多数の組み込みシリアライザーがあります。
使用可能なシリアライザーの完全なリストについては、「 シリアライザーの名前空間APIドキュメント 」を参照してください。
シリアライザー レジストリ
シリアライザー レジストリには、アプリケーションで使用できるすべての登録済みシリアライザーが含まれます。 組み込みシリアライザーの多くは、アプリケーションの起動時にシリアライザー レジストリに自動的に登録されます。 ただし、カスタム シリアライザーを使用する前に、次の例に示すように、それをシリアライザー レジストリに追加する必要があります。
BsonSerializer.RegisterSerializer(new CustomTypeSerializer());
シリアライザー レジストリにアクセスするには、次のようにBsonSerializer
クラスのSerializerRegistry
プロパティを使用します。
var intSerializer = BsonSerializer.SerializerRegistry.GetSerializer<int>();
重要
シリアライザー レジストリはグローバル レジストリです。 つまり、1 つのアプリケーションで複数のレジストリを使用することはできません。
カスタムシリアライザー
場合によっては、カスタム シリアライザーを作成する必要があるかもしれません。 カスタム シリアライザーを作成するときは、SerializerBase<T>
抽象基本クラスを実装し、 メソッドとDeserialize()
Serialize()
メソッドをオーバーライドします。
次のコード例は、カスタムBsonRegularExpression
シリアライザーを示しています。
class CustomRegularExpressionSerializer : SerializerBase<Regex> { public override Regex Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { var type = context.Reader.GetCurrentBsonType(); 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 override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, Regex value) { context.Writer.WriteRegularExpression(value); } }
オプトイン インターフェース
.NET/C# ドライバーには、シリアライザーが取り扱うデータ型に応じて、カスタム シリアライザー クラスで実装できるオプションのインターフェースがいくつかあります。
IBsonIdProvider
IBsonIdProvider インターフェースは メソッドとGetDocumentId()
SetDocumentId()
メソッドを提供しており、シリアル化するオブジェクトが_id
以外のObjectId
型を使用する場合に便利です。
IBsonDocumentSerializer
IBsonDocumentSerializer インターフェースを実装すると、ドライバーはシリアル化するオブジェクトのノード情報にアクセスできるようになります。これにより、ドライバーはカスタム シリアライザーを使用するときに型セーフなクエリを適切に構築できます。
IBsonArraySerializer
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# オブジェクトを直列化する方法の詳細については、次のページを参照してください。
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。