我有一個大的數據結構,我是serializing.At某些時候我需要編輯在數據structure.But值只是改變一個很小的值我將不得不再次重新序列化,而不是更新在文件中更改的值。我聽說過Google protocol buffer's。請問使用它解決了我重寫文件的問題?對我來說,使用協議緩衝區而不是Java序列化是更好的選擇嗎?協議緩衝區比序列化更好嗎?
4
A
回答
3
如果您關心性能,請勿爲您的數據使用文本格式。如果你想在沒有反序列化的情況下修改數據,你需要使用固定的記錄數據格式。你可能不得不手動發明這個。然後在文件中尋找正確的位置並重寫剛剛更改的字段。您可以查看DataOutputStream
以開始使用,或者使用數據庫(如HSQLDB
)來存儲和編輯您的數據。
更多這方面的思考,除非你的對象是很簡單的,我覺得一個數據庫將是一個更好的路要走。
上DataOutputStream聯合更多信息: http://download.oracle.com/javase/tutorial/essential/io/datastreams.html
的Java數據庫: http://java-source.net/open-source/database-engines
5
協議緩衝區本身是一個序列化格式,所以他們不會從根本上改變畫面(你仍然需要重新連載您更改值後)。
谷歌的文檔聲稱,協議緩衝區是更緊湊,速度比XML(這似乎是合理)來分析;不知道它們與原生Java序列化的比較。協議緩衝區的
優勢可能是便攜性(如果其他語言編寫的程序需要讀取文件)和可升級性(你可以不破壞文件格式的數據結構增加新的字段)。
1
您需要,可以直接例如XML或JSON修改的序列化格式。谷歌協議緩衝區是一個二進制格式 - 作爲Java序列化 - 因此不能直接修改...
4
幾個點
- 的沒有爲Protocol Buffers的二進制格式的編輯(http://code.google.com/p/protobufeditor/ )
- 協議緩衝區有一個文本格式,看起來像:
# Textual representation of a protocol buffer. # This is *not* the binary format used on the wire. person { name: "John Doe" email: "[email protected]" }
參見:
- 討論: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等)已在使用
- 您需要協議緩衝區的性能
- 您已經/計劃使用協議緩衝區
相關問題
- 1. 序列化/反序列化協議緩衝區
- 2. Java序列與協議緩衝區
- 3. 協議緩衝區
- 4. 谷歌協議緩衝區比較
- 5. 可視化gRPC和協議緩衝區
- 6. 將協議緩衝區序列化爲XML?
- 7. 協議緩衝區序列化到數據包中
- 8. 協議緩衝區的ASCII安全序列化
- 9. C++谷歌協議緩衝區:序列化爲char *?
- 10. 協議緩衝區反序列化和動態加載的DLL
- 11. 使用Google協議緩衝區多次反序列化消息
- 12. 是適用於長期序列化的協議緩衝區?
- 13. Android和協議緩衝區
- 14. 谷歌協議緩衝區 -
- 15. 協議緩衝區挑戰
- 16. JPA協議緩衝區
- 17. 協議緩衝區記錄
- 18. 協議緩衝區擴展
- 19. gson vs協議緩衝區
- 20. 協議緩衝區 - @ModelAttribute
- 21. Delphi協議緩衝區?
- 22. 協議緩衝區文件?
- 23. 協議緩衝區錯誤
- 24. 協議緩衝區序列化輸出是完全確定性的嗎?
- 25. 我可以使用C++從協議緩衝區中序列化/反序列化JSON嗎?
- 26. 協議緩衝區:無固定大小緩衝區的符號?
- 27. uwsgi協議比http協議更快嗎?
- 28. 通過REST發送協議緩衝區
- 29. Java中的擴展協議緩衝區
- 30. cmakeable版本的協議緩衝區
你可以給一個代碼示例。 – Emil 2010-10-16 07:13:16