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.ProtobufNuGet包,版本和你生成代码使用的protoc版本保持一致,避免兼容性问题 - 该反序列化器为通用实现,所有通过官方protoc生成的Protobuf消息类都可以直接使用,不需要为每个消息单独实现反序列化逻辑
内容的提问来源于stack exchange,提问作者Ali Shahzad
相关产品推荐
相关产品推荐

