我有一个大型数据结构,我正在序列化。在某些时候我需要编辑数据结构中的值。但只是为了更改一个小值我将不得不再次重新序列化它而不是更新文件中更改的值。我听说过Google protocol buffer's。使用它会解决我重写文件的问题吗?对我来说,使用协议缓冲区而不是Java序列化是一个更好的选择吗?
答案 0 :(得分:5)
协议缓冲区本身就是一种序列化格式,因此它们不会从根本上改变图像(在更改值后仍需要重新序列化)。
Google的文档声称协议缓冲区比XML更紧凑,解析速度更快(这似乎是合理的);不知道它们与本机Java序列化的比较。
协议缓冲区的优点可能是可移植性(如果用其他语言编写的程序需要读取文件)和可升级性(可以在不破坏文件格式的情况下向数据结构中添加新字段)。
答案 1 :(得分:4)
几点
# Textual representation of a protocol buffer. # This is *not* the binary format used on the wire. person { name: "John Doe" email: "jdoe@example.com" }
请参阅:
话虽如此,我会使用已经在使用的技术(JSon,Xml等),除非下列情况之一适用
答案 2 :(得分:3)
如果您关心性能,请不要对数据使用文本格式。如果要在不反序列化的情况下修改数据,则需要使用固定记录数据格式。您可能需要手动创建它。然后在文件中寻找正确的位置并重写仅更改的字段。您可以查看DataOutputStream
以开始使用,或者使用HSQLDB
等数据库来存储和编辑您的数据。
更多地考虑这一点,除非你的对象非常简单,否则我认为数据库将是一个更好的方法。
有关DataOutputStream的更多信息: http://download.oracle.com/javase/tutorial/essential/io/datastreams.html
Java数据库: http://java-source.net/open-source/database-engines
答案 3 :(得分:1)
您需要一种可以直接修改的序列化格式,例如XML或JSON。 Google协议缓冲区是二进制格式 - 作为java序列化 - 因此不能直接修改...