なぜこのクラスがシリアル化できないのですか?
-
20-09-2019 - |
質問
私はMersenne-Twisterの実装をで使用していました http://www.math.sci.hiroshima-u.ac.jp/~m-mat/versions/java/mtrandom.java デフォルトのドロップイン交換として java.util.Random
クラス。ただし、4つのフィールド(int、boolean、2つのバイト[])がとしてマークされています transient
. 。これは、カスタム機能を実装せずにこのクラスのオブジェクトをシリアル化できないことを意味します。
問題は、これらのフィールドが一時的にマークされている理由はありますか?そこに、ファイルからオブジェクトが読み取られたときに意味をなさない情報を保持するコードはありますか?削除しました transient
フィールドからの修飾子とそれは正常に動作しているようですが、私はそれを集中的にテストしていないので、それが壊れる場合があるかもしれませんか?
個人的には、クラスで行われていることはすべて算術です。
解決
おそらく、作成の背後にある理由 全て クラスの非静的フィールドの transient
そうだった MTRandom
クラスはバイナリの互換性を維持します java.util.Random
, 、そこから拡張されます。
したがって、理論的には、ANをシリアル化できます MTRandom
インスタンス、そしてそれをasとしてより脱必要にします Random
インスタンスとすべてが機能します。
それらのフィールドがそうでない場合 transient
, 、その後、それらはシリアル化され、互換性がありません。
ただし、私が知る限り、トランジェントを除去することはあなたに問題を引き起こすことはありません。
他のヒント
コメントから serialVersionUID
, 、著者はシリアル化を検討したくなかったようです。追加 transient
いくつかのコンパイラ/IDE警告を抑制した可能性があります。