TypeScript项目中Protobuf序列化字符串嵌套列表问题求助
解决方案:Protobuf定义二维字符串数组(字符串列表的列表)
你需要通过嵌套重复字段实现二维字符串数组的定义,Protobuf本身没有直接的二维数组类型,因此要先定义一个承载一维字符串列表的消息,再在外层消息中重复这个类型。
1. 正确的Protobuf定义
syntax = "proto3"; // 承载一维字符串列表,对应values里的每个子数组 message StringList { repeated string items = 1; } // 对应请求体里的stream对象结构 message Stream { string a = 1; string b = 2; string c = 3; string d = 4; string e = 5; string f = 6; string g = 7; } // 单个stream项,包含stream和values字段 message StreamItem { Stream stream = 1; // 重复StringList类型,实现二维字符串数组的结构 repeated StringList values = 2; } // 最外层请求体消息 message RequestBody { repeated StreamItem streams = 1; }
2. TypeScript中使用示例
生成TypeScript代码后,按如下方式构造并序列化数据:
import { RequestBody, StreamItem, Stream, StringList } from './generated-proto'; const requestBody = RequestBody.fromPartial({ streams: [ { stream: { a: "1", b: "2", c: "3", d: "4", e: "5", f: "6", g: "7" }, values: [ // 每个子数组对应一个StringList实例 StringList.fromPartial({ items: ["1675947803118000000", "logfmt"] }) ] } ] }); // 序列化请求体 const serialized = RequestBody.encode(requestBody).finish();
你之前尝试失败的原因
repeated string values = 2:仅能表示一维字符串数组,无法承载嵌套的二维结构google.protobuf.Any:用于存放任意Protobuf消息,并非原生字符串数组的适配方案- 自定义的
Values/MyMessage/MyFields:未正确定义内部的重复字符串字段,无法匹配二维数组的层级结构
内容的提问来源于stack exchange,提问作者Quentin M
相关产品推荐
相关产品推荐

