はじめに
シリアル化は、オブジェクトの状態をバイト-ストリームに変換することです。 シリアル化とは、Javaオブジェクトをデータベースに保存したり、ネットワーク経由で転送したりできるバイトの静的ストリーム(シーケンス)に変換することです。
シリアル化と逆シリアル化
シリアル化プロセスはインスタンスに依存しません。, オブジェクトは、あるプラットフォームでシリアル化し、別のプラット 授業の対象となるための直列化を実装する必要があると特別なマーカーインタフェース直列化可能です。ObjectInputStreamとObjectOutputStreamはどちらも、それぞれjava.io.InputStreamとjava.io.OutputStreamを拡張する高レベルのクラスです。 ObjectOutputStreamに書きはプリミティブ型は、オブジェクトのグラフをOutputStreamストリームとしてのバイトです。 これらの流れで、その後の読み込みが完了するとObjectInputStream.,
ObjectOutputStreamで最も重要なメソッドは次のとおりです。
public final void writeObject(Object o) throws IOException;
直列化可能オブジェクトを受け取り、それをバイトのシーケンス(ストリーム)に変換します。 同様に、ObjectInputStreamで最も重要なメソッドは次のとおりです。
public final Object readObject() throws IOException, ClassNotFoundException;
これは、バイトのストリームを読み取り、それをJavaオブジェクトに変換 これは元のオブジェクトにキャストバックできます。
Personクラスを使ってシリアル化を説明しましょう。 注意のことではないstaticフィールドに所属するクラスとオブジェクトは直列化されます。, また、シリアル化中にクラスフィールドを無視するためにキーワードtransientを使用できることに注意してください。
public class Person implements Serializable { private static final long serialVersionUID = 1L; static String country = "ITALY"; private int age; private String name; transient int height; // getters and setters}
以下のテストでは、Person型のオブジェクトをローカルファイルに保存し、この値を読み込む例を示しています。
Fileoutputstreamを使用して、このオブジェクトの状態をファイルに保存するためにObjectOutputStreamを使用しました。 ファイル”あなたのファイル。txt”をプロジェクトディレクトリに作成します。 このファイルは、FileInputStreamを使用してロードされます。 ObjectInputStreamこのストリームをピックアップし、p2という新しいオブジェクトに変換します。,
最後に、ロードされたオブジェクトの状態をテストし、元のオブジェクトの状態と一致します。
読み込まれたオブジェクトをPerson型に明示的にキャストする必要があることに注意してください。
Javaシリアル化の注意点
Javaでのシリアル化に関するいくつかの注意点があります。
3.1. 継承と構成
クラスがjava.io.Serializableインタフェースを実装する場合、そのすべてのサブクラスも直列化可能です。, 逆に、オブジェクトが別のオブジェクトへの参照を持っている場合、これらのオブジェクトはSerializableインタフェースを個別に実装する必要があります。
public class Person implements Serializable { private int age; private String name; private Address country; // must be serializable too}
serializableオブジェクトのいずれかのフィールドがオブジェクトの配列で構成されている場合、これらのオブジェクトもすべてserializableでなければなりません。
3.2. シリアルバージョンUID
JVMは、バージョン(long)番号を各シリアル化可能クラスに関連付けます。, 使用されていることを検証すること保存-読み込みオブジェクトが同じ属性との互換性に直列化します。
この番号は、ほとんどのIdeで自動的に生成され、クラス名、その属性、および関連するアクセス修飾子に基づいています。 変更すると、異なる数になり、InvalidClassExceptionが発生する可能性があります。
serializableクラスがserialVersionUIDを宣言しない場合、JVMは実行時に自動的に生成します。, ただし、生成されたクラスはコンパイラに依存しているため、予期しないInvalidClassExceptionsが発生する可能性があるため、各クラスがserialVersionUIDを宣言することを強くお勧め
3.3. Javaでのカスタムシリアル化
Javaでは、オブジェクトをシリアル化できるデフォルトの方法を指定します。 Javaクラ カスタム直列化できるときに特に役立ちうserializeオブジェクトはunserializable属性です。,
private void writeObject(ObjectOutputStream out) throws IOException;
および
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
これらのメソッドを使用すると、シリアル化できない属性をシリアル化できる他の形式にシリアル化できます。
public class Address { private int houseNumber; // setters and getters}
以下のユニットテストでは、このカスタムシリアル化をテストします。
このコードでは、カスタムシリアル化でaddressをシリアル化することによって、シリアル化できない属性を保存する方法を見ています。 NotSerializableExceptionを回避するには、unserializable属性をtransientとしてマークする必要があることに注意してください。,
結論
このクイックチュートリアルでは、Javaシリアライゼーションをレビューし、覚えておくべき重要なことについて説明し、カスタムシリアライゼーションを行う方法を示しました。