2

使用谷歌的Protocul Buffers,我有一个已经用 Java 编写的服务,它已经有自己的数据结构。我想使用 pb 来传递消息,我正在寻找一种方法将我在 Java 中拥有的现有数据结构序列化为 pb。我可以从头开始定义 pb 中的所有数据结构,这可能是正确的方法,但我太懒了。那么,假设我有一个 Java (或其他支持的语言)的 Person 类或一个具有数十个属性的 Plane 类,有没有办法将该类序列化为 pb?我可以有一个平面类型的 pb 属性吗?(当 Plane 不是 pb 时,它是一个 Java 类)

4

2 回答 2

3

不,你不能。protobuf 消息中的字段始终是原语(基本上是数字、字符串和字节数组)、protobuf 枚举(生成为 Java 枚举)或 protobuf 消息——当然,还有所有这些的重复版本。

您可能会编写一个使用反射从 Java 类创建 .proto 文件的工具,但我怀疑您会发现手动完成它会更快。特别是,如果您确实使用了反射,则需要确保始终使用相同的名称生成字段,以保持兼容性。您可以做的一件事是注释 Java 类并编写代码以基于这些注释生成 .proto 文件 - 甚至可能使用注释直接序列化为 proto 格式。就我个人而言,我建议以某种方式创建 .proto 文件,而不是有效地重写 PB 项目 - 否则在已经彻底测试过的代码中引入错误的风险很大。

如果您确实创建了一个注释系统,我相信 Kenton Varda(以及 PB 社区的其他成员)会对它感兴趣。

于 2008-11-17T07:05:19.200 回答
-2

我能想到的一种方法是在 protobuf 中有一个字符串字段,并使用 Java 的原始序列化将 Java 类序列化到该字段。这样,假设消息的接收者知道如何读取/反序列化它,我可以轻松地将 Java 序列化为 Java 消息。

不过,这种技术也有缺点。仅举几例:

  1. 它只是 Java 到 Java(没有 C++、Python 或其他)
  2. 它不如原生 protobufs 高效(解析/序列化和消息大小都不明智)
  3. 数据结构的逻辑分散在几个地方,一些在 protobufs 定义文件中,一些在其他 Java 类中,这使得事情更难维护。

但是 - 它可以在短期内完成工作。

于 2008-11-22T22:27:18.307 回答