Protobuf重复字段Json反序列化失败:Ids字段为空问题排查
问题原因与解决方案
核心原因
你用了.NET自带的System.Text.Json序列化/反序列化Protobuf生成的Request类,但Protobuf生成的重复字段(比如Ids对应的RepeatedField<int>类型)是Protobuf库特有的集合类型,System.Text.Json默认不识别该类型,反序列化时无法将JSON数组映射到RepeatedField实例,最终导致字段为空。
解决方案一:使用Protobuf官方JSON工具(推荐)
Protobuf库本身提供了专门适配自身生成类的JSON序列化/反序列化工具,直接使用即可解决问题:
// 序列化 string serializedReq = JsonFormatter.Default.Format(request); // 反序列化 var deserializedReq = Request.Parser.ParseJson(serializedReq);
解决方案二:给System.Text.Json添加自定义转换器
如果必须使用System.Text.Json,需要为RepeatedField<T>类型编写自定义转换器,实现JSON与该类型的映射:
public class RepeatedFieldConverter<T> : JsonConverter<RepeatedField<T>> { public override RepeatedField<T> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var list = JsonSerializer.Deserialize<List<T>>(ref reader, options); return new RepeatedField<T>(list); } public override void Write(Utf8JsonWriter writer, RepeatedField<T> value, JsonSerializerOptions options) { JsonSerializer.Serialize(writer, value.AsReadOnly(), options); } }
反序列化时指定该转换器:
var options = new JsonSerializerOptions(); options.Converters.Add(new RepeatedFieldConverter<int>()); var deserializedReq = JsonSerializer.Deserialize<Request>(serializedReq, options);
额外注意点
你的代码里new Request;存在语法错误,应修正为new Request();,但这不是导致反序列化结果为空的原因。
内容的提问来源于stack exchange,提问作者Hangboo
相关产品推荐
相关产品推荐

