首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将协议缓冲区序列化为XML?

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

Stack Overflow用户
提问于 2011-05-16 12:39:52
回答 2查看 10.9K关注 0票数 3

协议缓冲区Java教程声明:

协议消息类提供的一个关键特性是反射。..。使用反射的一种非常有用的方法是将协议消息与其他编码(如XML或JSON )进行转换。

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

消息类在MessageLite类上增加的最大特性是内省和反射。

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

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

代码语言:javascript
复制
<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的唯一现有解决方案(结果在一定程度上是人类可读的)是java格式

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

有没有人遇到过一种XML序列化解决方案,它保留了协议缓冲器的大部分吸引人的功能(只是对序列化时间较慢和所产生的消息更大的影响)?

或者如何利用现有流行的Java序列化库之一的协议缓冲区的“反射”特性?

致以敬意,

/George

PS如果您想知道我为什么要序列化到XML,那是因为我需要一种在特定情况下手动编辑消息的廉价方式(用编程术语来说)。

EN

回答 2

Stack Overflow用户

发布于 2011-05-16 23:33:34

Protobuf是另一个兼容Protobuf的库,它支持以“数值”模式序列化到JSON。

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

票数 1
EN

Stack Overflow用户

发布于 2011-05-24 20:31:49

考虑到您的PS消息,我将选择一个不同于尝试序列化到/从XML的路径。如果我想吐,我会发现Java相当于以下内容。

我会查看google/protobuf/io/printer.h来生成UTF-8,人类可读的对象,然后使用google/protobuf/io/tokenizer.h接口来读取被操纵的protobuf对象中的内容。要简单得多,Protobuf几乎为你做了所有的工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6017512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档