如何使用MongoDB C# Driver反序列化类中的readonly私有字段
问题根因
MongoDB C# 驱动默认会遵循C#语言的readonly修饰符约束,反序列化过程中不会给readonly字段写入值,所以即使配置了字段映射,查询得到的Company实例里对应字段仍然是初始化的空集合。移除readonly后驱动允许正常赋值,所以反序列化恢复正常。
解决方案
不需要修改Company类的定义,也不用移除readonly修饰符,只需要调整Bson类映射的配置,显式告知驱动允许对这两个readonly字段执行反序列化写入即可:
public static class Mapping { public static IServiceCollection AddMappings(this IServiceCollection services) { BsonClassMap.RegisterClassMap<Company>(classMap => { classMap.AutoMap(); classMap.MapField("_executedImportInfo") .SetElementName(nameof(Company.ExecutedImportInfo)) // 覆盖字段只读状态,允许驱动通过反射写入值 .SetIsReadOnly(false) // 直接往已初始化的List中填充元素,不需要替换字段实例 .SetDeserializationMethod(MemberDeserializationMethod.Populate); classMap.MapField("_stockPrices") .SetElementName(nameof(Company.StockPrices)) .SetIsReadOnly(false) .SetDeserializationMethod(MemberDeserializationMethod.Populate); }); return services; } }
如果你的驱动版本较新,只加SetIsReadOnly(false)也可以正常反序列化,SetDeserializationMethod是适配字段已提前初始化集合的场景,避免反序列化时生成新的集合实例替换原有字段值,稳定性更高。
内容的提问来源于stack exchange,提问作者Bulchsu
相关产品推荐
相关产品推荐

