问题标签 [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 投票
6 回答
22770 浏览

c# - 使用 protobuf-net 的 C# 项目中的协议缓冲区 - 代码生成的最佳实践

我正在尝试在 C# 项目中使用 protobuf,使用 protobuf-net,并且想知道将其组织到 Visual Studio 项目结构中的最佳方法是什么。

当手动使用 protogen 工具将代码生成到 C# 中时,生活似乎很轻松,但感觉并不正确。

我希望 .proto 文件被视为主要源代码文件,生成 C# 文件作为副产品,但在 C# 编译器参与之前。

选项似乎是:

  1. 原型工具的自定义工具(虽然我看不到从哪里开始)
  2. 预构建步骤(调用 protogen 或执行此操作的批处理文件)

我一直在上面的 2)中挣扎,因为它一直给我“系统找不到指定的文件”,除非我使用绝对路径(而且我不喜欢强制明确定位项目)。

是否有一个约定(还)?


编辑: 根据@jon的评论,我重试了预构建步骤方法并使用了这个(protogen的位置现在硬编码),使用谷歌的地址簿示例:


Edit2: 采纳@jon 的建议,通过不处理 .proto 文件(如果它们没有更改)来最小化构建时间,我已经拼凑了一个基本工具来检查我(这可能会扩展到一个完整的自定义构建工具):

我的预构建命令现在是(全部在一行上):

0 投票
8 回答
8092 浏览

protocol-buffers - 您会推荐 Google Protocol Buffers 或 Caucho Hessian 用于跨语言的无线二进制格式吗?

您会推荐 Google Protocol Buffers 或 Caucho Hessian 用于跨语言的无线二进制格式吗?或者其他什么,例如 Facebook Thrift?

0 投票
2 回答
19017 浏览

c# - Protocol Buffer 有多快或多轻?

.NET 的协议缓冲区会比 Remoting(SerializationFormat.Binary)更轻量/更快吗?在语言/框架方面会有一流的支持吗?即它是否像 Remoting/WebServices 一样透明地处理?

0 投票
5 回答
20720 浏览

python - memcached 中对象的最佳序列化方法是什么?

我的 Python 应用程序当前使用python-memcached API来设置和获取 memcached 中的对象。此 API 使用 Python 的本机pickle 模块来序列化和反序列化 Python 对象。

这个 API 使得将嵌套的 Python 列表、字典和元组存储在 memcached 中变得简单而快速,并且将这些对象读回应用程序是完全透明的——它可以正常工作。

但是我不想局限于只使用 Python,如果所有的 memcached 对象都用 pickle 序列化,那么用其他语言编写的客户端将无法工作。

以下是我考虑过的跨平台序列化选项:

  1. XML - 主要的好处是它是人类可读的,但这在这个应用程序中并不重要。XML 也占用大量空间,而且解析成本很高。

  2. JSON - 似乎是一个很好的跨平台标准,但我不确定它在从 memcached 读回时是否保留对象类型的特征。例如,根据这篇文章,元组在使用simplejson时被转换为列表;此外,似乎向 JSON 结构添加元素可能会破坏写入旧结构的代码

  3. Google Protocol Buffers——我对此非常感兴趣,因为它看起来非常快速和紧凑——至少比 XML 小 10 倍;它不是人类可读的,但这对这个应用程序并不重要;它似乎旨在支持在不破坏旧代码的情况下扩展结构

考虑到这个应用程序的优先级,memcached 的理想对象序列化方法是什么?

  1. 跨平台支持(Python、Java、C#、C++、Ruby、Perl)

  2. 处理嵌套数据结构

  3. 快速序列化/反序列化

  4. 最小内存占用

  5. 在不破坏旧代码的情况下灵活更改结构
0 投票
4 回答
2309 浏览

.net - C# 中的协议缓冲区:如何处理盒装值类型

在以下示例中:

我很好奇 protobuf-net 或 dotnet-protobufs 将如何处理这些类。我对protobuf-net比较熟悉,所以我实际拥有的是:

但是,我收到一条错误消息,提示“未找到合适的默认对象编码”。有没有一种简单的方法来处理这些课程,我只是不知道?

要详细说明用例:

这是远程处理中使用的数据类的缩小版本。所以基本上它看起来像这样:

注意:为简单起见,我省略了 ISerializable 实现,但正如您所期望的那样。

0 投票
4 回答
8899 浏览

c# - 如何检测协议缓冲区消息何时被完全接收?

这是我的另一个问题的一个分支。如果您愿意,请阅读它,但这不是必需的。

基本上,我意识到,为了在大型消息上有效地使用 C# 的 BeginReceive(),我需要 (a) 先读取数据包长度,然后准确读取那么多字节,或者 (b) 使用数据包结尾分隔符。我的问题是,这些中的任何一个都存在于协议缓冲区中吗?我还没有使用它们,但是查看文档似乎没有长度标题或分隔符。

如果没有,我该怎么办?我应该只构建消息然后使用长度标头/EOP 分隔符为其添加前缀/后缀吗?

0 投票
4 回答
11541 浏览

performance - Google 协议缓冲区与 ASN.1 相比如何

Google Protocol Buffers 和 ASN.1(使用 PER 编码)之间最显着的区别是什么?对于我的项目,最重要的问题是序列化数据的大小。有没有人在两者之间进行过任何数据大小的比较?

0 投票
8 回答
70156 浏览

java - 高性能序列化:Java vs Google Protocol Buffers vs ...?

对于我正在考虑为即将到来的项目做的一些缓存,我一直在考虑 Java 序列化。即,应该使用它吗?

现在我以前写过自定义序列化和反序列化(Externalizable),因为过去几年的各种原因。如今,互操作性已成为一个更大的问题,我可以预见到需要与.Net 应用程序交互,因此我考虑使用独立于平台的解决方案。

有没有人有过高性能使用 GPB 的经验?它在速度和效率方面与 Java 的原生序列化相比如何?或者,还有其他值得考虑的方案吗?

0 投票
3 回答
22365 浏览

c# - 使用 protobuf-net 反序列化未知类型

我有 2 个联网应用程序,它们应该相互发送序列化的 protobuf-net 消息。我可以序列化对象并发送它们,但是,我无法弄清楚如何反序列化接收到的字节

我试图用这个反序列化,但它失败了一个 NullReferenceException。

我在包含消息类型 ID 的序列化字节之前传递了一个标头,我可以在一个巨大的 switch 语句中使用它来返回预期的子类类型。使用下面的块,我收到错误:System.Reflection.TargetInvocationException ---> System.NullReferenceException。

这是我用来通过网络发送消息的功能:

这个类,带有基类,我正在序列化:


使用 Marc Gravell 的建议进行了修复。我从只读属性中删除了 ProtoMember 属性。也切换到使用 SerializeWithLengthPrefix。这是我现在拥有的:

接收对象:

发送对象:

0 投票
1 回答
4148 浏览

c++ - C++ 序列化性能

我正在构建一个分布式 C++ 应用程序,该应用程序需要对存储在 std 容器中的数据进行大量序列化和反序列化。

目前采用的是Boost.serialization。然而,它的表现很糟糕。我们的 B-tree 也使用了 Boost.serialization 来存储键值对数据,但是,如果我们将 Boost.serialziation 改为 memcpy,访问速度将提高 10 倍或更多。鉴于目前的分布式平台,需要进行如此多的数据交换,因此也需要易于编程和高性能。我知道协议缓冲区也可以用作序列化机制,但是,我不确定 Boost.serialization 和协议缓冲区之间的性能比较,另一个问题是,是否存在更好的解决方案来提供接近 memcpy 的更高性能?

谢谢