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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:00:59