C# MongoDB自定义序列化去除Object字典的_t/_v字段
MongoDB自定义序列化器实现:移除Dictionary<string, object>的_t/_v字段
我来帮你搞定这个自定义序列化器的实现,思路很清晰——既然只需要移除object类型默认带的_t和_v字段,而且不用考虑反序列化,那我们只需要在序列化时直接按值的实际类型来写,跳过MongoDB默认的类型标识逻辑就行。
完整代码实现
首先是你的MyClass定义(调整成符合C#规范的命名):
public class MyClass { public Dictionary<string, object> Maps { get; set; } }
然后是核心的自定义序列化器MySerializer:
using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Serializers; public class MySerializer : SerializerBase<MyClass> { public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, MyClass value) { var writer = context.Writer; // 开始写入MyClass对应的MongoDB文档 writer.WriteStartDocument(); if (value.Maps != null && value.Maps.Count > 0) { // 启动Maps字段的文档写入 writer.WriteStartDocument("Maps"); foreach (var kvp in value.Maps) { writer.WriteName(kvp.Key); // 关键:按值的实际类型序列化,跳过默认的类型标识 BsonSerializer.Serialize(writer, kvp.Value.GetType(), kvp.Value); } // 结束Maps文档的写入 writer.WriteEndDocument(); } // 结束MyClass文档的写入 writer.WriteEndDocument(); } }
关键逻辑说明
- 我们没有使用MongoDB默认的
object类型序列化(会自动添加_t和_v),而是通过kvp.Value.GetType()获取值的真实类型,再传递给序列化方法,这样MongoDB就会按照值的实际类型生成对应的BSON数据,不会附加类型标识字段。 - 因为你不需要考虑反序列化,所以我们完全不用处理读取逻辑,只专注于正确写入数据即可。
最后一步:注册序列化器
别忘了在应用启动时告诉MongoDB使用这个自定义序列化器来处理MyClass:
// 比如在Program.cs或者Startup类的初始化逻辑里添加 BsonSerializer.RegisterSerializer(typeof(MyClass), new MySerializer());
这样不管你的Maps字典里的object值是字符串数组、普通字符串、数字还是其他简单类型,序列化后都不会出现讨厌的_t和_v字段啦。
内容的提问来源于stack exchange,提问作者idlackage
相关产品推荐
相关产品推荐

