2013-07-20 46 views
0

我正在編寫遊戲。我明白,序列化對保存和多人遊戲很有用。如果我在客戶端選擇多人遊戲時強制更新,我認爲沒有任何理由使用serialversionuid。關於遊戲序列化的建議

對於保存,我有一個問題:id是否影響我將保存的遊戲數據轉換爲新的遊戲更新版本的能力?還是說所有的邏輯都是基於的,把id作爲簡單的參考來提供手頭遊戲的版本?

感謝任何人提前。我會upvote,如果我的代表更高:P

編輯:兩個答案都非常有幫助。從他們中,我收集了關於序列化和遊戲編程的內容:擁有s-uid將會有所幫助,因爲遊戲中不同版本的不同版本需要參考其版本才能在各個版本之間兼容或不兼容。一個「遊戲版本ID」不足以提供信息。感謝澄清傢伙!

回答

1

是的,serialVersionUid旨在是一個散列或版本,可以精確地標識數據是由哪個版本的Serializable類輸出的。

不幸的是,它主要是作爲序列化的障礙 - 通過引起每一次小的改變破壞序列化。任何不同的版本都會導致拋出異常。

推薦的做法是在您的java源代碼中生成或分配一個serialVersionUid常量,以避免不必要的不​​兼容。根據JavaDoc:

爲了保證跨不同的Java編譯器 實現一致的serialVersionUID值,序列化類必須聲明一個明確的 的serialVersionUID值。

如果你深入到Java源代碼可能能夠找到方法來實現/重寫,它可以讓您對序列化的更多控制。

參見:

  • java.io.ObjectInputStream中
  • java.io.ObjectOutputStream中
  • java.io.Externalizable中
1

什麼情況是,如果你沒有一個serialVersionUID是基於類結構計算的。在實踐中,它意味着如果你稍微改變了類(可以包括那些不會簡單地添加實例變量的東西,也就是說,你認爲對於序列化/反序列化不重要的東西),你的反序列化將失敗,因爲序列化的反序列化對象現在將產生一個serialVersionUID,其不同於,它與您爲其保溼的課程計算出的值不同。

簡單的答案就是申報一個。如果你這樣做,java將使用聲明的序列化,並且序列化不會對變化敏感。請注意,您仍然可以通過添加/刪除實例變量來分解它,但它會更加健壯。它也無所謂 - 它不需要與serialversion工具生成的長度相匹配,使用1或任何其他長整數是完全安全的,只要您在對類進行重大更改時進行更改。

(編輯 - SO上的一些有用的人張貼this reference on how the serialVersionUID is calculatedhere