繁体   English   中英

语言特定数据结构的protobuf序列化

[英]protobuf serialization of language specific data structures

使用Google的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项目-否则,在已经经过全面测试的代码中存在引入错误的巨大风险。

如果您确实创建了注释系统,我相信Kenton Varda(以及PB社区的其他成员)将有兴趣看到它。

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

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

  1. 这只是Java到Java(没有C ++,Python或其他语言)
  2. 它不像本地protobuf那样高效(无论是解析/序列化还是消息大小)
  3. 您将数据结构的逻辑分散在几个地方,有些在protobufs定义文件中,有些在其他Java类中,这使事情难以维护。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM