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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:40:24