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

C# Confluent.Kafka使用Protobuf-net反序列化Protobuf消息报错如何解决

异常原因

你当前调用的Serializer.Deserialize<T>(stream)是protobuf-net库提供的反序列化API,该API依赖类上标注的[ProtoContract]/[ProtoMember]等序列化契约特性才能识别类型。但你项目中的FinalValue类是通过Google官方protoc工具生成的,基于Google.Protobuf库实现,完全不包含protobuf-net需要的契约标记,因此protobuf-net无法识别该类型,抛出"Type is not expected, and no contract can be inferred"异常。

解决方案

直接使用Google.Protobuf库自带的反序列化逻辑即可,你生成的FinalValue类已经内置了静态Parser属性,专门用于反序列化操作,修改自定义反序列化器代码如下:

using Google.Protobuf;
using Confluent.Kafka;

// 添加泛型约束:T必须实现Google.Protobuf的IMessage<T>接口
public class MyCustomDeserializer<T> : IDeserializer<T> where T : IMessage<T>
{
    public T Deserialize(ReadOnlySpan<byte> data, bool isNull, SerializationContext context)
    {
        // 空值直接返回默认
        if (isNull) return default;
        // 直接用消息类自带的Parser解析,不需要额外创建MemoryStream,性能更好
        return T.Parser.ParseFrom(data);
    }
}
注意事项
  • 确保项目已安装Google.Protobuf NuGet包,版本和你生成代码使用的protoc版本保持一致,避免兼容性问题
  • 该反序列化器为通用实现,所有通过官方protoc生成的Protobuf消息类都可以直接使用,不需要为每个消息单独实现反序列化逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:51:04