序列化
概述
在本指南中,您可以学习如何使用MongoDB .NET/C# 驱动程序进行序列化。序列化是将C#对象映射到BSON文档以存储在MongoDB中的过程。
序列化器
序列化器是处理C#对象与BSON文档之间转换的类。序列化器实现了IBsonSerializer
接口。.NET/C# 驱动程序包含许多内置序列化器,用于处理基本类型、集合类型和自定义类。
有关可用序列化器的完整列表,请参阅 序列化器命名空间API文档。
序列化器注册表
序列化器注册表包含所有可用的已注册序列化器。许多内置序列化器在应用程序启动时自动注册到序列化器注册表中。但是,在使用自定义序列化器之前,您必须将其添加到序列化器注册表中,如下例所示
BsonSerializer.RegisterSerializer(new CustomTypeSerializer());
要访问序列化器注册表,请使用以下方式使用BsonSerializer
类的SerializerRegistry
属性
var intSerializer = BsonSerializer.SerializerRegistry.GetSerializer<int>();
重要
序列化器注册表是一个全局注册表。这意味着您不能在单个应用程序中使用多个注册表。
自定义序列化器
要创建自己的自定义序列化器,实现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
IBsonIdProvider 接口提供了 GetDocumentId()
和 SetDocumentId()
方法,如果序列化的对象使用除 ObjectId
之外的其他 _id
类型,则非常有用。
IBsonDocumentSerializer
实现IBsonDocumentSerializer接口允许驱动程序访问您正在序列化的对象成员信息。这允许驱动程序在使用自定义序列化器时正确构建类型安全的查询。
IBsonArraySerializer
实现IBsonArraySerializer接口允许驱动程序访问数组中各个项目的序列化信息。
附加信息
要了解如何使用 .NET/C# 驱动程序序列化 C# 对象的更多信息,请参阅以下页面
要了解本指南中讨论的任何方法或类型,请参阅以下 API 文档