协议缓冲区比序列化更好?

Posted

技术标签:

【中文标题】协议缓冲区比序列化更好?【英文标题】:Protocol Buffer better than serialization? 【发布时间】:2010-10-12 12:09:34 【问题描述】:

我有一个正在序列化的大型数据结构。在某些时候我需要编辑数据结构中的值。但只是为了更改一个小值,我必须再次重新序列化它而不是更新文件中更改的值。我听说过Google protocol buffer's。使用它可以解决我重写文件的问题吗?使用协议缓冲区而不是 Java 序列化对我来说是更好的选择吗?

【问题讨论】:

【参考方案1】:

协议缓冲区本身就是一种序列化格式,因此它们不会从根本上改变图片(更改值后仍需要重新序列化)。

Google 的文档声称协议缓冲区比 XML 更紧凑且解析速度更快(这似乎是合理的);不知道它们与本机 Java 序列化相比如何。

协议缓冲区的优点可能是可移植性(如果用其他语言编写的程序需要读取文件)和可升级性(您可以在不破坏文件格式的情况下向数据结构添加新字段)。

【讨论】:

【参考方案2】:

几点

    Protocol Buffers 二进制格式的编辑器 (http://code.google.com/p/protobufeditor/) 协议缓冲区的文本格式如下:
# 协议缓冲区的文本表示。 # 这*不是*网络上使用的二进制格式。 人 名称:“约翰·多伊” 电子邮件:“jdoe@example.com”

见:

讨论:http://groups.google.com/group/protobuf/browse_thread/thread/04fc478088137bf3 类:http://code.google.com/apis/protocolbuffers/docs/reference/java/com/google/protobuf/TextForm

话虽如此,我会使用一种已经在使用的技术(JSon、Xml 等),除非满足以下条件之一

    您需要协议缓冲区的性能 您已经/计划使用协议缓冲区

【讨论】:

【参考方案3】:

如果您关心性能,请不要对数据使用文本格式。如果要在不反序列化的情况下修改数据,则需要使用固定记录数据格式。您可能必须手动发明它。然后寻找文件中的正确位置并仅重写更改的字段。您可以查看DataOutputStream 以开始使用,或者使用诸如HSQLDB 之类的数据库来存储和编辑您的数据。

考虑更多,除非您的对象非常简单,否则我认为数据库将是更好的选择。

有关 DataOutputStream 的更多信息: http://download.oracle.com/javase/tutorial/essential/io/datastreams.html

Java 数据库: http://java-source.net/open-source/database-engines

【讨论】:

【参考方案4】:

您需要一种可以直接修改的序列化格式,例如 XML 或 JSON。 Google 协议缓冲区是一种二进制格式——作为 java 序列化——因此不能直接修饰...

【讨论】:

以上是关于协议缓冲区比序列化更好?的主要内容,如果未能解决你的问题,请参考以下文章

协议缓冲区是不是支持具有共享引用的对象图的序列化?

谷歌协议缓冲区是不是支持序列化前的大小计算?

iOS 网络 - Moya 和协议缓冲区序列化

确定协议缓冲区消息类型的最佳实践

提升序列化与谷歌协议缓冲区? [关闭]

是否可以使用协议缓冲区序列化 System.Object 对象列表