升级C# MongoDB 2.19后已注册类映射仍抛InvalidCastException如何解决?
问题描述
我们有一系列基于MongoDB的微服务,升级至2.19版本前运行正常,但升级后全部故障,所有测试均无法通过。ObjectSerializer的破坏性变更给代码库带来诸多问题,我们不愿回滚版本,但目前只能通过为每个实体注册自定义序列化器来修复,这导致类映射重复。
官方建议的修复代码:
var objectSerializer = new ObjectSerializer(type => ObjectSerializer.DefaultAllowedTypes(type) || type.FullName.StartsWith("MyNamespace")); BsonSerializer.RegisterSerializer(objectSerializer);
对我们无效,会抛出默认对象序列化器重复错误。我们所有类均符合MongoDB官方类映射指南,请问是否有无需额外编写自定义序列化器的代码更新方案?
解决方案
核心问题原因:官方代码直接注册新的
ObjectSerializer会和驱动默认已注册的序列化器冲突,导致重复注册报错。正确的做法是扩展已有的默认序列化器的允许类型规则,而非重新注册新实例。具体实现代码:
// 获取驱动已注册的默认ObjectSerializer实例 var defaultSerializer = BsonSerializer.LookupSerializer<object>() as ObjectSerializer; if (defaultSerializer != null) { // 扩展允许类型的规则:保留默认允许的类型,同时添加自定义命名空间下的类型 defaultSerializer.AllowedTypes = type => ObjectSerializer.DefaultAllowedTypes(type) || type.FullName?.StartsWith("MyNamespace") == true; }注意事项:
- 这段代码需要在应用启动初期、任何MongoDB操作执行前执行(比如微服务的Startup/Program类中),确保全局生效。
- 如果微服务采用模块化架构,要避免在多个模块中重复执行这段代码(可通过单例初始化逻辑控制)。
- 验证时直接测试实体的序列化/反序列化操作,确认无需再为单个实体注册自定义序列化器。
内容的提问来源于stack exchange,提问作者APW
相关产品推荐
相关产品推荐

