2010-10-12 62 views
4

我有一個大的數據結構,我是serializing.At某些時候我需要編輯在數據structure.But值只是改變一個很小的值我將不得不再次重新序列化,而不是更新在文件中更改的值。我聽說過Google protocol buffer's。請問使用它解決了我重寫文件的問題?對我來說,使用協議緩衝區而不是Java序列化是更好的選擇嗎?協議緩衝區比序列化更好嗎?

回答

3

如果您關心性能,請勿爲您的數據使用文本格式。如果你想在沒有反序列化的情況下修改數據,你需要使用固定的記錄數據格式。你可能不得不手動發明這個。然後在文件中尋找正確的位置並重寫剛剛更改的字段。您可以查看DataOutputStream以開始使用,或者使用數據庫(如HSQLDB)來存儲和編輯您的數據。

更多這方面的思考,除非你的對象是很簡單的,我覺得一個數據庫將是一個更好的路要走。

上DataOutputStream聯合更多信息: http://download.oracle.com/javase/tutorial/essential/io/datastreams.html

的Java數據庫: http://java-source.net/open-source/database-engines

+0

你可以給一個代碼示例。 – Emil 2010-10-16 07:13:16

5

協議緩衝區本身是一個序列化格式,所以他們不會從根本上改變畫面(你仍然需要重新連載您更改值後)。

谷歌的文檔聲稱,協議緩衝區是更緊湊,速度比XML(這似乎是合理)來分析;不知道它們與原生Java序列化的比較。協議緩衝區的

優勢可能是便攜性(如果其他語言編寫的程序需要讀取文件)和可升級性(你可以不破壞文件格式的數據結構增加新的字段)。

1

您需要,可以直接例如XML或JSON修改的序列化格式。谷歌協議緩衝區是一個二進制格式 - 作爲Java序列化 - 因此不能直接修改...

4

幾個點

  1. 的沒有爲Protocol Buffers的二進制格式的編輯(http://code.google.com/p/protobufeditor/
  2. 協議緩衝區有一個文本格式,看起來像:
 
# Textual representation of a protocol buffer. 
# This is *not* the binary format used on the wire. 
person { 
    name: "John Doe" 
    email: "[email protected]" 
} 

參見:

說了這麼多,除非以下情況之一適用

    我會用技術(JSON,XML等)已在使用
  1. 您需要協議緩衝區的性能
  2. 您已經/計劃使用協議緩衝區