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

有帮助吗?

解决方案

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

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

如果你创建一个注释系统,我相信Kenton Varda(以及PB社区的其他成员)会有兴趣看到它。

其他提示

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

但这种技术有缺点。仅举几例:

  1. 它只是Java到Java(没有C ++,Python或其他)
  2. 它不如本机protobuf效率高(既没有解析/序列化,也没有消息大小明智)
  3. 你有几个地方分散的数据结构的逻辑,一些在protobufs定义文件中,一些在其他Java类中,这使得事情更难维护。
  4. 但是 - 它可以在短期内完成工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top