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

使用protobuf-net序列化Protobuf生成类时无法推断契约错误如何解决

错误根因

你遇到的报错核心原因是混用了两套互不兼容的Protobuf实现:

  • 存放proto文件的DotNet Standard类库使用Google官方的Google.Protobuf+Grpc.Tools工具生成C#消息类,生成的类仅适配Google官方的序列化逻辑
  • 测试项目使用第三方protobuf-net库执行序列化操作,protobuf-net无法识别Google官方生成类的序列化契约,因此抛出找不到类型契约的异常

解决方案

你可以二选一统一技术栈即可:

方案1:全栈统一使用Google官方Protobuf(推荐,和你现有类库配置适配度最高)

  1. 删除测试项目中的protobuf-net NuGet包,安装和DotNet Standard类库版本一致的Google.Protobuf包
  2. 替换测试项目中的序列化代码为Google官方实现:
    using MemoryStream stream = new();
    objectToBeSerialized.WriteTo(stream);
    
  3. 优化DotNet Standard类库的NuGet引用:如果你的业务不需要使用gRPC通信,直接删除冗余的Grpc包即可,Grpc.Tools作为编译期代码生成工具,你当前的PrivateAssets配置是正确的,无需修改。

方案2:全栈统一使用protobuf-net

  1. 调整DotNet Standard类库的代码生成逻辑:不再使用Grpc.Tools生成C#类,改用protobuf-net配套的代码生成工具生成适配protobuf-net的消息类,或者手动给消息类添加[ProtoContract]、[ProtoMember]序列化特性
  2. 删除DotNet Standard类库中的Google.Protobuf、Grpc、Grpc.Tools包,统一引用protobuf-net相关包
  3. 所有上层项目统一使用相同版本的protobuf-net包执行序列化/反序列化操作

最佳实践建议

  • 不要混用两套Protobuf实现:Google官方Protobuf和protobuf-net是独立实现,生成的消息类、序列化逻辑完全不兼容,同项目栈必须统一使用其中一套
  • 按需引用依赖包:如果仅使用Protobuf序列化能力、不需要gRPC通信,无需引入任何gRPC相关依赖,减少冗余包体积
  • 统一依赖版本:所有涉及Protobuf操作的项目,必须使用同一序列化库的同一大版本,避免跨版本兼容性问题

内容的提问来源于stack exchange,提问作者DrGriff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:12:00