C#使用MongoDB时反序列化Card接口派生类出现鉴别器错误
解决MongoDB反序列化Card接口的错误
1. 修正属性名不匹配问题
观察MongoDB存储的文档,用户的卡字段是Cardul,但你的User类中对应的属性是Card,驱动无法匹配字段导致反序列化失败。给Card属性添加BsonElement特性指定对应字段名:
修改User类的Card属性:
[BsonElement("Cardul")] public Card Card { get; set; }
2. 配置MongoDB驱动识别Card接口的派生类
MongoDB驱动默认不知道Card接口的实现类是Silver和Gold,需要显式注册这些派生类作为接口的已知实现,有两种配置方式:
方式一:接口特性标记
给Card接口添加BsonKnownTypes特性,直接指定实现类:
[BsonKnownTypes(typeof(Silver), typeof(Gold))] interface Card { // 原有接口内容 }
方式二:全局驱动映射配置
在程序初始化MongoDB连接的位置,注册接口与派生类的映射关系:
BsonClassMap.RegisterClassMap<Card>(cm => { cm.AutoMap(); cm.AddKnownType(typeof(Silver)); cm.AddKnownType(typeof(Gold)); });
3. 确保派生类的访问权限
你的Silver和Gold类使用默认访问修饰符(internal),如果MongoDB驱动所在程序集与这些类不在同一程序集,需将类改为public,或在程序集级别添加InternalsVisibleToAttribute让驱动能访问内部类;若在同一程序集则无需修改。
完成以上修改后,重新执行查询代码即可正常反序列化Gold类型的Card属性。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

