题
使用谷歌的 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消息。
但这种技术有缺点。仅举几例:
- 它只是Java到Java(没有C ++,Python或其他)
- 它不如本机protobuf效率高(既没有解析/序列化,也没有消息大小明智)
- 你有几个地方分散的数据结构的逻辑,一些在protobufs定义文件中,一些在其他Java类中,这使得事情更难维护。 醇>
但是 - 它可以在短期内完成工作。
不隶属于 StackOverflow