3

ObjectInputStreamの Javadoc から:

列挙定数は、通常のシリアライズ可能または外部化可能オブジェクトとは異なる方法でデシリアライズされます。enum 定数のシリアル化された形式は、その名前だけで構成されます。定数のフィールド値は送信されません。列挙定数を逆シリアル化するために、ObjectInputStream はストリームから定数名を読み取ります。次に、列挙型定数の基本型と受け取った定数名を引数として静的メソッド Enum.valueOf(Class, String) を呼び出すことにより、シリアル化解除された定数が取得されます。他のシリアライズ可能または外部化可能オブジェクトと同様に、列挙型定数は、シリアライゼーション ストリームでその後に現れる後方参照のターゲットとして機能できます。列挙型定数を逆シリアル化するプロセスはカスタマイズできません。クラス固有の readObject、readObjectNoData、enum 型で定義された readResolve メソッドは、逆シリアル化中に無視されます。同様に、serialPersistentFields または serialVersionUID フィールドの宣言も無視されます。すべての列挙型の serialVersionUID は 0L に固定されています。

Javaの列挙型が完全にシリアル化されないのはなぜですか? Java の列挙型は単なる定数ではなく、状態を含むこともできる本格的なクラスです。送信側と受信側で矛盾した状態になっていませんか?ここで私が見逃している基本的な点は何ですか?

4

1 に答える 1

7

レッスンは、変更可能なオブジェクトが必要な場合は列挙型を使用しないことです。はい、内部状態を維持する列挙型を設計できますが、そのように設計されていません。シリアル化の場合と同様に、Java のすべての部分が連携するわけではありません。

enum値を状態データに関連付ける必要がある場合は、 EnumMap. そのクラスは を実装Serializableしているため、状態データをシリアル化するために追加の作業を行う必要はありません (状態データ オブジェクト自体がシリアル化可能である場合)。

于 2013-08-21T15:12:52.863 に答える