You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:03:59