繁体   English   中英

将协议缓冲区序列化为XML?

[英]Serializing protocol buffers to XML?

协议缓冲Java教程状态:

协议消息类提供的一个关键特性是反射。 [...]一种非常有用的反射方法是将协议消息转换为其他编码,例如XML或JSON。

如果你看一下com.google.protobuf.Message,它会说:

[MessageLite类的Message类]最大的附加功能是内省和反思。

这似乎表明协议缓冲区已准备好与许多现有的基于Java反射的序列化库一起使用,但实际上我并不认为它们意味着传统Java意义上的反映。

例如,如果我尝试使用XStream(一个用于使用反射将Java对象序列化为XML的流行库)序列化我的一个协议缓冲区消息,我得到:

<com.x.MyProtos_-MyMessage resolves-to="com.google.protobuf.GeneratedMessageLite$SerializedForm">
    <messageClassName>com.x.MyProtos$MyMessage</messageClassName>
    <asBytes>CjkKDkJXQkUwMDAzNzkzMTA3EgsZAAAAAAAA8D8gASIGEJYBGMIDKhIpuB6F61G4nj8xuB6F61G4
Xnj8KMQoGQURBQkliEgsZAAAAAAAA8D8gASIGEJYBGMIDKhIpuB6F61G4nj8xuB6F61G4nj8qAyDQ
Dw==</asBytes>

[我注意到XML提到了GeneratedMessageLite,即MessageLite的子类,即使序列化的实例是com.google.protobuf.Message的实例]

将协议缓冲区序列化为XML的唯一现有解决方案(结果有些人类可读)我发现是protobuf-java-format

这会产生很好的输出 - 但是因为它不输出标记值,即字段的数字ID。 因此,在反序列化方面看起来并不像生成的XML会非常健壮,即据我所知,使用标准协议缓冲区序列化,如果更改字段名称,事情将继续正常工作,但保留标记值相同,然后尝试反序列化在这些更改之前序列化的字节序列。

有没有人遇到一个XML序列化解决方案,它保留了协议缓冲区的大部分有吸引力的功能(只是减少了序列化时间和更大的结果消息)?

或者研究如何利用一个流行的现有Java XML序列化库来利用协议缓冲区的“反射”功能?

问候,

/乔治

PS如果你想知道我为什么要序列化为XML,那是因为我希望在某些情况下手动编辑消息的便宜(用编程术语)方式。

Protostuff是另一个与Protobuf兼容的库,支持在“数字”模式下序列化为JSON。

http://code.google.com/p/protostuff/wiki/JsonSerialization

鉴于您的PS消息,我将采用与尝试序列化到XML或从XML序列化不同的路线。 普科我找到Java相当于以下的。

我会看一下google / protobuf / io / printer.h来生成UTF-8,人类可读的对象,然后使用google / protobuf / io / tokenizer.h接口读回操作的protobuf对象。 更容易,Protobuf几乎为您完成所有工作。

暂无
暂无

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

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