オブジェクトの直列化機構:
オブジェクトのシリアル化メカニズムは、それによって恒久的にディスク上に格納されるバイナリストリーム、バイナリを可能にする、または別のネットワークノードにネットワークを介してストリーミング、バイナリストリームに変換するプラットフォームに依存しないJavaオブジェクトのメモリを可能にします。他のプログラムがそのようなバイナリストリームを得るために場合は、元のJavaオブジェクトに戻すことができます。
オブジェクトのシリアル化の条件:
Serializableを1、道具;
; 2は、グローバル定数決勝静的ロングserialVersionUIDのプライベートを定義する
PersonクラスSerializableインタフェースを実装する現在の必要性に加えて、3、また、その内部のすべてのプロパティも直列化可能であることを確認しなければならない;。(デフォルトでは、基本的なデータシーケンスのタイプ)
4、クラスで定義された修飾された静的および一時変数をシリアル化することができません。
serialVersionUIDの役割:
serialVersionUIDのserialVersionUIDのバイトストリームは、実行時にローカルエンティティ・クラスに対応するクラスのバージョンを決定することにより、整合性を検証するためのJavaシリアル化メカニズム、
serialVersionUIDのが定義されていない場合、プログラムは自動的にserialVersionUIDのが生成され、シリアライズクラスが変更されている場合、逆シリアル化中にフロントへ戻っは、それが対応するローカルエンティティクラスのserialVersionUIDの変更になります。したがって、バイトストリームは異なるserialVersionUIDの、
直列化復元の際に、JVMが来ますバイトストリームのserialVersionUIDのserialVersionUIDは、ローカルエンティティクラスに対応し、同じが同じであると見なされた場合、デシリアライズすることができ、そうでなければ矛盾バージョン配列異常が存在することになります。(InvalidCastExceptionが)
オブジェクトフロー:ObjectInputStreamのとOjbectOutputSteam
データ型またはオブジェクトの基本的なデータを記憶し、読み出すためのプロセスフローは、そのオブジェクトのパワーとなるデータソースへのJavaで記述することができ、また、データソースから返されたオブジェクトを復元することが可能です。
- シリアル化:クラスObjectOutputStreamの機構を備えた基本データ型またはオブジェクト保存します。
- デシリアライズ:のObjectInputStreamを読み取るデータ・タイプまたはオブジェクトクラスの根底にあるメカニズム。
- ObjectOutputStreamのと同じObjectInputStreamの缶は、静的および過渡メンバー変数の順序を変更できません。
例:
シリアライズとデシリアライズの次のオブジェクト・エンティティクラスの実装:
class Person implements Serializable{
private static final long serialVersionUID = 1231242L;
private String name;
private int age;
private String gender;
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
//此处省略get/set方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
ObjectOutputStreamのテストクラス:
package cn.jingpengchong.io;
import java.io.*;
public class ObjectStreamTest {
public static void main(String[] args) {
testObjectOutputStream();
}
private static void testObjectOutputStream() {
ObjectOutputStream output = null;
try {
output = new ObjectOutputStream(new FileOutputStream("object.dat"));
output.writeObject(new Person("孙悟空",520,"男"));
//将缓存区的数据刷新到输出流中
output.flush();
System.out.println("操作成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
if(output != null){
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
結果は以下の通りである:
ObjectInputStreamのテストクラス:
package cn.jingpengchong.io;
import java.io.*;
public class ObjectStreamTest {
public static void main(String[] args) {
testObjectInputStream();
}
private static void testObjectInputStream() {
ObjectInputStream input = null;
try {
input = new ObjectInputStream(new FileInputStream("object.dat"));
Person per = (Person)input.readObject();
System.out.println(per);
} catch (Exception e){
e.printStackTrace();
} finally {
if(input != null){
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
結果は以下の通りであります: