C#使用BsonSerializer反序列化MongoDB BsonDocument映射自定义类失败
问题原因
该错误由MongoDB BsonSerializer的默认映射规则导致,核心原因有两个:
- 默认Id字段约定冲突
BsonSerializer内置了主键映射逻辑,默认会将C#类中命名为Id、ID、id的属性自动映射到MongoDB文档的系统主键_id字段,不会作为普通属性匹配Bson中名为Id的自定义字段,因此你Bson文档里的Id字段无法匹配到GDetails类的Id属性。 - 序列化特性不兼容
你在MainSDocument、MainState类上标记的[JsonObject]、[JsonProperty]属于Newtonsoft.Json的序列化特性,BsonSerializer默认不会读取这些配置,如果你没有额外配置序列化器兼容Newtonsoft特性,这些标注不会对Bson反序列化生效。
解决方案
方案1(推荐,改动最小)
给GDetails类的Id属性显式指定Bson映射字段名,打破默认Id约定:
public class GDetails { [BsonElement("Id")] public int Id { get; set; } public string GSerial { get; set; } }
方案2(全局配置,适合多类存在同类型问题的场景)
在程序启动阶段注册GDetails的自定义类映射,关闭默认Id映射:
BsonClassMap.RegisterClassMap<GDetails>(cm => { cm.AutoMap(); // 显式映射Id属性到Bson的Id字段 cm.MapMember(c => c.Id).SetElementName("Id"); });
注意点
你当前仅在MainSDocument类上标记了[BsonIgnoreExtraElements],如果后续Bson结构有变动,MainState、GDetails类遇到未映射字段也会抛出异常,可按需给这两个类也加上该特性。
内容的提问来源于stack exchange,提问作者user20358
相关产品推荐
相关产品推荐

