A.シリアル化および逆シリアル化の紹介
シリアライズとデシリアライズとは何ですか?
シリアル化は、オブジェクトとしてのバイトのシーケンスを変換する処理です。
デシリアライズの回復プロセスは、オブジェクトのバイトのシーケンスです。
使用のシリアライズどこ?
通常、二つの目的の順序:
- 永久にハードディスクに保存されたターゲットバイトシーケンスは、一般的にファイルがあります。
- ネットワークで送信されたバイトの標的配列。
シーケンスの意義?
長期保存を可能にするためにメモリ空間を残すことができる対象が出て独立してプログラムを実行できることをシリアル化機構。
例:次の時間は、あなたが以前の設定を保持するために、プログラムが終了を実行すると、ユーザー情報設定クラスのレコードは、設定ファイルがディスク上に存在するとして、あなたはそのクラスを使用することができ、その後、各実行をお読みください。
II。シリアライズとデシリアライズポイント
シリアルインターフェース(直列化)
シリアライズされたオブジェクトにSerializableを、それ以外の場合は異常持つNotSerializableExceptionを実装する必要があり、シリアライズすることはできません
過渡キーワード
いないすべての要素がシーケンスのいくつかの要素が必要とされていない場合、あなたが使用することができ、シリアル化する必要があることに注意過渡、キーワードの変更をしている過渡修正要素は、JVMのデフォルトのシリアライズされません。
JVMデシリアライゼーションを可能にのみクラスパスと関連した機能コードが同じで、より重要なの一種であるシリアライゼーションIDは、つまり、一致しています
private static final long serialVersionUID
配列ID-生成戦略は、二つあります。一つは1Lに固定され、一方がランダムに長い非反復データ型を発生させます。
アドバイス:デフォルト1Lの使用に関する特別な要件。
シリアル化は、静的変数を保存しません。
オブジェクトの状態が保存されているシリアル化、静的変数は静的変数の配列が保存されないように、クラスに属する状態になっています。
この記事では、比較的明確で、個人的な感触の良いされています[ Javaシリアルは理解進出(再生) ]
使用III。シリアライゼーションおよびデシリアライゼーション
シリアル化の実装:
java.io.ObjectOutputStream
のOutputStreamから継承されたクラス、プリミティブデータ型Javaオブジェクトを永続ストレージの目的を達成するために、ファイルに書き込まれます。コンストラクタ:
ObjectOutputStream(OutputStream out)
:作成したObjectOutputStreamは、指定されたOutputStreamを書き込み、書き込みオブジェクト直列化する方法:
public final void writeObject(Object obj)
:ObjectOutputStreamのに指定されたオブジェクト。一連のステップ:
- ObjectOutputStreamの出力ストリームを作成します。
- ObjectOutputStreamのオブジェクトのwriteObject出力直列化可能オブジェクトを呼び出します。
例:
import java.io.Serializable; public class Person implements Serializable{ public static final long serialVersionUID = 1L; public String name; public int age; public Person(String name, int age) { this.name = name; this.age = age; } }
import java.io.*; public class TestObjectOutputStream { public static void main(String[] args) throws IOException { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt")); Person p = new Person("zhangsan", 20); Person p1 = new Person("lisi", 30); oos.writeObject(p); oos.writeObject(p1); oos.close(); } }
デシリアライズの実装:
java.io.ObjectInputStream
入力ストリームから継承されたクラスは、ObjectOutputStreamのを使用する前に、オブジェクトへの生データのバックをシリアル化。コンストラクタ:
ObjectInputStream(InputStream in)
:ObjectInputStreamのは、指定されたInputStreamから読み込む作成します。直列化復元は、読み取りメソッドをオブジェクト:
public final Object readObject()
:ObjectInputStreamのからオブジェクトを読み込みます。手順をデシリアライズ:
- ObjectInputStreamの入力ストリームを作成します。
- ObjectInputStreamのオブジェクトは呼び出しのreadObject()シリアライズされたオブジェクトを取得します。
実施例1:読み出し対象の上記配列は、人インスタンス化されます
import java.io.*; public class TestObjectInputStream { public static void main(String[] args) throws IOException,ClassNotFoundException{ ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt")); // 按写入的顺序读出 Person p = (Person)ois.readObject(); Person p1 = (Person)ois.readObject(); System.out.println("name:" + p.name + ",age:" + p.age); System.out.println("name:" + p1.name + ",age:" + p1.age); ois.close(); } }
説明:
直列化復元オブジェクト内の直列化復元するために、あなたはそれがスローされます、クラスはファイルを見つけることができない場合は、対応するクラスファイルクラス・ジョブ・クラスを見つけることができなければなりませんClassNotFoundExceptionが。
デシリアライズはまた別の例外を表示されることがありますによりInvalidClassExceptionを。
考えられる理由は次のとおりです。
- IDのそのような配列は、(serialVersionUIDの溶液を使用して)直列化されたIDの一致のストリームから読み出され
- このクラスは、不明なデータ型が含まれています
- 引数なしでこのクラスのコンストラクタはアクセスできません。