问题标签 [protocol-buffers]

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 投票
1 回答
2359 浏览

c++ - 您能否将相同的 protobuf 消息静态链接到多个 DLL 中 - 然后让这些 DLL 一起工作?

我们正在使用 google protobufs 在网络上传递数据。事物的服务器端类似于插件,因此处理 protobuf 消息的几个模块是 DLL。一些 DLL 依赖于其他 DLL,并使用其他的消息来定义自己的消息。

因此,A.DLL 具有a.proto生成a.pb.h/cc的消息类MsgA。使用dllexport_declprotoc 编译器上的未记录选项,消息类被声明为 DLL 导出。

现在,B.DLL 依赖于 A.DLL,b.proto看起来像这样:

最后,将各部分组合在一起的可执行文件也取决于 message MsgA。protobuf 库也被构建为 DLL 并链接到所有内容。这一切都构建并运行。

但是,有光明势力要求我们减少 DLL 分发!因此,我将模块 A(它只是许多其他插件 DLL 使用的消息和小工具的集合)构建为静态库而不是 DLL。B.DLL 和可执行文件都链接到 A 并且一切都很好 - 到目前为止。

由于 A 是静态链接的,MsgA因此在所有 DLL 和 EXE 中得到完全定义。没关系,因为生成的 C++ 代码中的所有静态数据都是 const。那么如果最终过程中有多个副本怎么办 - 所有副本都是相同的。

但是,当我运行新构建的进程时,libproto 会抛出一个实际有用的异常——MsgA 的文件 ID 已经存在于描述符映射(或类似的东西)中。换句话说,存在多个定义的事实MsgA 一个主要问题。

所以,最后,这是一个问题:

  • 如果我们静态链接 libproto 而不是将其用作 DLL,错误会消失吗?
  • MsgA分散在 DLL中的多个定义真的安全吗?

一旦我开始重建 protobuf 库,我可能会在几天内回答第一点,但第二点超出了我目前的知识范围。我也希望得到一个快速向上或向下的答案,这可能会为我省去重新编译原型库的麻烦。

0 投票
11 回答
30907 浏览

java - Java 中协议缓冲区分隔的 I/O 函数是否有 C++ 等效项?

我正在尝试从 C++ 和 Java 文件中读取/写入多个协议缓冲区消息。谷歌建议在消息之前写长度前缀,但默认情况下没有办法这样做(我可以看到)。

但是,2.1.0 版中的 Java API 收到了一组“定界”I/O 函数,这些函数显然可以完成这项工作:

有 C++ 等价物吗?如果没有,Java API 附加的大小前缀的有线格式是什么,所以我可以在 C++ 中解析这些消息?


更新:

这些现在存在于google/protobuf/util/delimited_message_util.hv3.3.0 中。

0 投票
1 回答
1086 浏览

c# - 从 windows mobile 如何将 C# 对象发送到 http 流

场景:Windows Mobile C# Compact framework 2.0 或 3.5 Protobuf 对象

我需要将一个对象发送到一个 http url (Post)。之后,我将等待响应并收到对象的修改版本。关于如何连接到 http 流并传入序列化对象的任何输入?

0 投票
1 回答
2476 浏览

.net - Protobuf-net - 序列化 .NET GUID - 如何在 C++ 中读取它?

我已经在我的 .NET 应用程序中使用 Protobuf-net 相对轻松地序列化了一个对象。我还使用 GetProto() 命令获得了 protobuf-net 生成的 .proto 文件。

在 .NET 生成的 .proto 文件中,我的 GUID 字段的类型为“bcl.guid”。

现在我希望用 C++ 编译 .proto 文件,这样我就可以反序列化数据。

但是,C++ protoc.exe 编译器不知道如何解释 bcl.guid,并抛出错误消息“VideoAudioStructs.proto:11:13: "Guid" is not defined。” 我该怎么办?

0 投票
1 回答
451 浏览

django - django:调用远程服务杀死python

我正在编写一个与远程服务通信的 django 应用程序(在我的 VPN 上但不在本地托管)。我可以通过 django shell 成功地与服务通信,但是当我尝试调用完全相同的函数,从网络表单发布信息时,开发服务器就死了。

我原以为 shell 和开发服务器的行为方式完全相同。我唯一能想到的是外壳可能更“耐心”,等待响应?

通信通过协议缓冲区发生。

帮助!

0 投票
2 回答
4411 浏览

java - 使用协议缓冲区进行二进制日志记录

我们正在考虑使用 Protocol Buffers 进行二进制日志记录,因为:

  • 无论如何,这就是我们编码对象的方式
  • 它相对紧凑,读/写速度快等。

也就是说,我们应该如何去做并不明显,因为 API 倾向于专注于创建整个对象,因此将 DataLogEntry 列表包装为 DataLogFile 中的重复字段将是您在消息传递方面所做的事情,但是我们真正想要的只是能够写入然后读取整个 DataLogEntry,将其附加到文件的末尾。

我们这样做遇到的第一个问题是这样做(在测试中:

只会导致从流中读取 1 个 DataLogEntry。没有 isAtEnd,它永远不会停止。

想法?

编辑:我已经切换到使用 entry.writeDelimitedTo 和 BidLogEntry.parseDelimitedFrom ,这似乎工作......

0 投票
1 回答
2550 浏览

c# - protobuf-net - 在 C++ 端反序列化的问题:(

我在我的 .NET 应用程序中使用 ProtoBuf-Net 来序列化以下内容:(以 .proto 格式)

我的目标是将其序列化并将其作为单个样本注入 ASF 文件。

我称之为序列化:

然后我从 ms 对象中得到一个字节数组:

我把这个字节数组放在 ASF 中。最大的问题是我的 C++ 应用程序可以很好地读取 ASF 示例,当我尝试反序列化它时遇到内存访问冲突:(

这是我的 C++ 代码:

(其中 m_screenBuffer 是 ProtoScreenBuffer,serBuffer 是我从 ASF 文件中得到的原始字节数组,dwInputDataLen 是它的长度。)

对于我正在尝试做的事情,我在这里做的任何事情都是错误的吗(在 C# .NET 中序列化并在 C++ 中反序列化?)

非常感谢。

罗伊

0 投票
3 回答
8838 浏览

c++ - 如何通过套接字发送.proto(协议缓冲区)中定义的类

我正在尝试通过套接字发送原型,但出现分段错误。有人可以帮忙告诉我这个例子有什么问题吗?

文件.proto

xxx.cpp

感谢您的帮助和回复-

0 投票
5 回答
37657 浏览

c++ - Linux 中的 Google protobuf

我正在使用 protobuf 和 Linux。它的编译器在哪里protoc?我已经从主站点下载了包,编译并安装成功,但我找不到protoc构建自己的格式文件。它在哪里?

更新 这是我构建protobuf的文件夹:

没有我需要的二进制文件。

0 投票
1 回答
1326 浏览

serialization - XStream <-> 替代二进制格式(例如协议缓冲区)

我们目前使用 XStream 将我们的 Web 服务输入/输出编码为 XML。但是,我们正在考虑切换到具有多种语言(protobuf、Thrift、Hessian 等)的代码生成器的二进制格式,以便更轻松地支持新客户,减少对手动编码的依赖(也更好地支持我们的包含二进制数据的消息格式) .

然而,我们在服务器上的大多数对象都是 POJO,使用 XStream 通过反射和注释处理序列化,并且这些库中的大多数假设它们将自己生成 POJO。我可以想到几种连接替代库的方法:

  1. 为目标格式编写一个 XStream 封送拆收器。

  2. 编写自定义代码以将 POJO 编组到/来自替代库生成的类。

  3. 子类化生成的类以实现 POJO 逻辑。可能需要一些重写。(我还提到我们想使用 Terracotta 吗?)

  4. 使用另一个同时支持反射(如 XStream)和代码生成的库。

但是我不确定哪个序列化库最适合上述技术。