0

ゲームのコーディングをしています。連載がセーブやマルチプレイに役立つことは理解しています。クライアントがマルチプレイヤーを選択したときに更新を強制する場合、serialversionuid を使用する理由がわかりません。

保存について質問があります。ID は、保存されたゲームプレイ データをゲームの新しい更新バージョンに変換する機能に影響しますか? それとも、ID を手元のゲームのバージョンへの単純な参照として残して、すべてロジックに基づいているのでしょうか?

事前に誰にでも感謝します。私の担当者が高ければ賛成します:P

編集:両方の回答は非常に役に立ちました。それらから、シリアライゼーションとゲーム プログラミングについてこれを収集します。ゲーム内のさまざまなもののさまざまなバージョンは、バージョン間の互換性または非互換性を実現するために、それらのバージョンへの参照が必要になるため、s-uid を持つことは有益です。1 つの「ゲーム バージョン ID」では十分な情報ではありません。みんなを明確にしてくれてありがとう!

4

2 に答える 2

1

はい、データが出力されたクラスserialVersionUidのバージョンを正確に識別するハッシュまたはバージョンを意図しています。Serializable

残念ながら、これは主にシリアライゼーションの障害として機能します。つまり、すべての小さな変更がシリアライゼーションを壊す原因となります。バージョンが異なると、例外がスローされます。

serialVersionUid不必要な非互換性を避けるために、Java ソースで定数を生成または割り当てることをお勧めします。Javadoc から:

異なる Java コンパイラの実装間で一貫した serialVersionUID 値を保証するには、シリアライズ可能なクラスで明示的な serialVersionUID 値を宣言する必要があります。

Java ソースを掘り下げると、実装/オーバーライドするメソッドを見つけることができる場合があります。これにより、シリアライゼーションをより詳細に制御できます。

見る:

  • java.io.ObjectInputStream
  • java.io.ObjectOutputStream
  • java.io.外部化可能
于 2013-07-20T01:17:14.030 に答える
1

serialVersionUID がない場合、クラス構造に基づいて計算されます。実際には、クラスを多少変更すると (インスタンス変数を単純に追加しないもの、つまり、シリアライゼーション/デシリアライゼーションにとって重要ではないと思われるものを含めることができます)、デシリアライゼーションが失敗することを意味します。オブジェクトは、ハイドレート先のクラスに対して計算されたものとは異なるserialVersionUID を生成するようになりました。

簡単な答えは、それを宣言することです。これを行うと、Java は宣言されたものを使用し、シリアライゼーションは変更の影響を受けにくくなります。インスタンス変数を追加/削除することでこれを壊すことはできますが、より堅牢になることに注意してください。また、それが何であるかは問題ではありません。serialversiontool から生成された long と一致する必要はありません。クラスに重大な変更を加えた場合に変更する限り、1 またはその他の long を使用しても完全に安全です。 .

(編集 - SO の一部の親切な人が、serialVersionUID の計算方法に関するこのリファレンスを ここに投稿しました)

于 2013-07-20T01:20:34.050 に答える