序列化
在此页面上
Overview
在本指南中,您可以了解如何使用 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()
方法,如果要序列化的对象使用_id
以外的ObjectId
类型,则该接口非常有用。
IBsonDocumentSerializer
实施 IBsonDocumentSerializer 接口使驱动程序能够访问正在序列化的对象的成员信息。这允许驱动程序在使用自定义序列化器时正确构造类型安全的查询。
IBsonArraySerializer
实施 IBsonArraySerializer 接口使驱动程序能够访问数组中各个项目的序列化信息。
规则
约定包允许您定义约定并将应用到驾驶员在序列化期间使用的类及其成员。约定指定了如何在C#对象和MongoDB文档之间映射数据,而无需使用属性来修饰每个类。
.NET/ C#驱动程序提供了内置约定,可用于自定义序列化进程。下表描述了一些内置约定:
公约 》 | 说明 |
---|---|
在序列化和反序列化期间将元素名称转换为驼峰式大小写。 | |
在序列化和反序列化期间将枚举值转换为指定的表示形式。 | |
指定在反序列化期间是否忽略文档中的额外的元素。 | |
指定允许使用对象序列化器序列化哪些类型。 |
您可以通过使用指定约定实例化 ConventionPack
,然后将其传递给 ConventionRegistry.Register()
方法来注册约定,如以下示例所示:
var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCaseConvention", camelCaseConvention, t => true);
更多信息
要了解有关使用 .NET/C# 驱动程序序列化 C# 对象的更多信息,请参阅以下页面:
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: