问题标签 [proto3]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
5668 浏览

go - 如何在 Proto3 中为 HTTP 响应创建可空字段?

我想将一个对象作为 HTTP 响应返回,其中一个字段可以为空。问题是 proto3 不会让我轻易做到。发生这种情况是因为我将字符串指针解析为字符串,因此当指针指向 null 时会产生此错误 runtime error: invalid memory address or nil pointer dereference

我试图通过至少从互联网上学到的这两种变通方法来解决这个问题。

1.使用一个

exercise.proto(消息定义)

mapper.go(解析 Go 结构以适应原始消息)

2.使用google/protobuf/wrappers.proto

exercise.proto(消息定义)

mapper.go(解析 Go 结构以适应原始消息)

预期结果

两种方式仍然产生相同的错误消息,唯一的区别是它引用的代码行。这就是为什么我如此无助。预期的 HTTP 响应如下所示

我真的希望任何人都可以帮助我找到一种方法来在 proto3 中为 Http 响应定义一个可为空的字段,以及如何从 struct 中解析它。谢谢!

0 投票
0 回答
232 浏览

c# - proto2 无法读取 proto3 消息

我们已决定升级到 proto3,但仍然需要能够与运行 proto2 的设备通信一段时间。

required现在我们面临一些问题,一些消息由于关键字而无法在 proto2 端反序列化。

这是我们对 (proto2) 有问题的一条消息。

如果我们尝试将此消息发送到 proto2 客户端并设置值如下小时=1、分钟=2、微秒=0,则客户端无法反序列化此消息。设置 microseconds=1 则 proto2 客户端读取消息没有问题。

这归结为以下生成的 C# 代码

因此,如果字段具有与数据类型的默认值相同的值,则生成的 proto3 代码似乎不会发送任何字段。这当然会使 proto2 不高兴并且不想反序列化消息,因为该字段被标记为required但没有收到任何值。

是否可以强制协议生成始终发送所有字段的代码(即使它们设置了默认值),还是可以通过其他方式解决?

谢谢

0 投票
1 回答
69 浏览

protocol-buffers - 您如何将文件响应定义为消息

proto用来定义 REST 服务

在我的服务中,我试图记录服务响应文件。

我已经浏览了这里https://github.com/protocolbuffers/protobuf/tree/master/src/google/protobuf但找不到任何看起来像文件的东西。

0 投票
0 回答
57 浏览

c# - 当我执行“构建>清洁解决方案”时,我想将所有“.proto”文件从一个目录复制到另一个目录]

我正在使用 .proto 文件(Proto3),当我执行 Build>Clean 解决方案时,我想将所有 .proto 文件从一个目录(外部项目)复制到另一个目录(VS 项目内部)。

提前致谢。

我试图修改“Visual C# 项目文件(.csproj)”文件但没有成功

我希望将所有 .proto 文件复制到项目内部的文件夹中。

0 投票
1 回答
118 浏览

proto3 - 如何在 proto3 中保留枚举的所有值?

我有一个我想弃用的枚举类型的字段。没有客户端使用此字段或其枚举类型。我想保留这个枚举中的所有值,以便它不能被重用。

我的第一个想法是尝试保留以下值0 to max

但是,我收到一条错误消息,指出Foo必须至少包含一个值。有没有办法像这样弃用整个枚举以确保它不被重用?

0 投票
1 回答
1089 浏览

java - 如何使用 proto3 oneof 功能复制字段名称?

Proto3 支持 oneof 功能,您可以在其中拥有包含多个字段的消息,并且最多可以同时设置一个字段。

由于一次将设置一个字段,因此在原型模式中具有重复的字段名称是合理的。问题是 proto 生成器将其视为重新定义。

我想这样做是因为在我的情况下,这使得 json 序列化JsonFormat变得简单。

例如,我可能喜欢

有没有办法解决这个问题,还是必须努力重新定义原型?一个可能的解决方法可能是例如使用map<string, Properties> properties = 9;

0 投票
1 回答
880 浏览

python-3.x - gRPC:如何结合静态和流参数调用远程过程?

我正在尝试使用 gRPC 传输文件。我可以使用 gRPC 流发送数据,分成块。我正在寻找将文件名与数据一起传输的方法。我确定我缺少一个明显的解决方案。但这里有一些我能想到的方法

  1. 与每个块一起发送文件名,这是重传相同数据的明显缺点。.proto 文件看起来像
  1. 将文件名作为第一个块发送。接收器需要知道这种编码。

但我正在寻找一个非hacky的解决方案。

我希望有一个像

但根据这里的回答,这是不可能的,也不鼓励

一般来说,有没有一种更简洁的方法来调用一个结合了普通参数和流参数的过程?或达到同样的效果?

0 投票
1 回答
1722 浏览

protocol-buffers - Protobuf 消息/枚举类型重命名和连线兼容性?

(实际上)是否可以在不中断通信的情况下更改protobuf 消息类型(或枚举)的类型名称?

显然,需要修改使用代码才能重新编译。问题是使用相同结构但旧名称的旧客户端是否会继续工作?

示例,基于真实文件:

test.proto

如果更改类型或枚举名称,protobuf 有效负载的在线格式是否会发生任何变化?

0 投票
0 回答
588 浏览

go - 如何从 protobuf 文件生成字符串切片的映射?

正如协议缓冲区文档所述:

每个映射字段在类型结构中生成一个字段, map[TKey]TValue其中TKey字段的键类型TValue是字段的值类型...

我想设置TValue为一段字符串。所以在 Go 中它会生成:

还考虑到关于重复字段的注释:

同样,对于字段定义repeated bytes foo = 1;,编译器将生成一个 Go 结构体,其中包含一个[][]byte名为Foo

我正在尝试执行以下操作:

但这只是吐出一个错误:

我可以这样做:

输出:

但是,在实现Params中将需要用作一个url.Values来构建查询字符串。最后一个解决方案需要额外的迭代,并将数据复制到一个 newmap[string][]string中,我想避免这种情况。

(如何)我可以让协议缓冲区生成字符串切片的(Go)映射吗?我正在使用 gRPC 插件。

0 投票
1 回答
825 浏览

c++ - Protobuf 中重复字段的问题。使用重复字段进行序列化/反序列化的更好方法是什么?

考虑以下 sensor.proto 文件,该文件使用重复字段来初始化多条消息。

现在我想将一些随机数据序列化到一个文件中。例如,我将拥有一个带有多个传感器的设备,因此 proto 中的重复文件。我使用以下代码。

要解析数据并打印出结果,我使用以下命令:

重现结果的主文件:

遍历整个传感器大小并获得正确的索引以显示适当的字段似乎并不直观。即使通过检查

将输出感觉不正确的尺寸 12,或

不会输出任何内容,因为它位于不正确的索引中。使用 libprotobuf 定义重复字段以更好地进行序列化/反序列化的更好方法是什么。


编辑:正如答案所暗示的,序列化到文件应该是