Javaシリアル化(シーケンス化)

4384 ワード

シリアル化(serialization)とは、1つのオブジェクトの現在の状態をバイトストリーム(a stream of bytes)に変換するプロセスであり、逆シリアル化(deserialization)とは、シリアル化プロセスの逆プロセスを指し、バイトストリームを1つのオブジェクトに変換し、原形に戻す.
一、シリアル化の意味:
1:Webアプリケーションの無状態の弊害を解決する
オブジェクトがシリアル化されると、結果として得られるバイトは、保存可能な場所であれば、ファイル、データベース、またはメモリに格納できます.オブジェクトを復元する必要がある場合は、格納されている場所から逆行するだけです.オブジェクト固有のこのような特性は、重要なステータス情報がユーザ要求間で保持されることを可能にするため、ステータスのないWebアプリケーションにとって非常に重要である.
2:アプリケーション境界間でオブジェクトを渡す
シリアル化により、アプリケーション境界間でオブジェクトを渡すこともできます.プログラマは、オブジェクトの状態を記述するバイトストリームをネットワーク上で渡し、反対側で一致するオブジェクトに逆列化することができます.本質的には、シリアル化により、オブジェクトが「数値」で別のアプリケーションに渡されます.
二:オブジェクトのシリアル化
Javaでオブジェクトをシリアル化するには、次の手順に従います.
1.オブジェクトのクラスはSerializableインタフェースを実現しなければならない.
2.オブジェクトのシリアル化メンバーは、非静的メンバー変数でなければなりません.すなわち、メンバーメソッドと静的メンバー変数は保存できません.また、シリアル化は変数の値のみを保存し、変数の修飾子は保存できません.一部のタイプのオブジェクトでは、ステータスは瞬時であり、このようなオブジェクトはステータスを保存できません.たとえば、ThreadオブジェクトやFileInputStreamオブジェクトなどです.これらのフィールドにはtransientキーで表記する必要があります.
注意:オブジェクトのクラスが完全に保存されているため、メンバーメソッドと静的メンバー変数を保存する意味はありません.
3、1つのオブジェクトをシリアル化するには、一定のオブジェクト入出力ストリームに関連付け、オブジェクト出力ストリームを介してオブジェクト状態を保存し、オブジェクト入力ストリームを介してオブジェクト状態を復元する必要があります.
三、具体的な実現
1、シリアル化の対象:Person類
import java.io.Serializable;
/*  
 * time:2008-07-19  
 * author:coke  
 */ 

/*
 *    Serializable 
 */
public class Person implements Serializable {
	private static final long serialVersionUID = 1L;
	private int age; // will persist
	private String name; // will persist
	// transient  Java   ,  JVM transient       (primitive type)  
	//  (object)       ,            。
	private transient String pwd; // will not persist
	public Person() {
	}

	public Person(int age, String name,String pwd) {
		this.age = age;
		this.name = name;
		this.pwd=pwd;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
}

2、シリアル化と逆シリアル化
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;
/*
 * time:2008-07-19
 * author:coke
 */
public class TestSerializable {
	private static File f = null;

	//   
	public static void serialization() {
		f = new File("D://t.m");
		try {
			if (f.exists())
				f.delete();
			f.createNewFile();

		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		Person p = new Person(10, "xplq", "123456");
		try {
			ObjectOutputStream out = new ObjectOutputStream(
					new FileOutputStream(f));
			out.writeObject(p);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//    
	public static void deserialization() {
		if (!f.exists())
			return;
		try {
			ObjectInputStream input = new ObjectInputStream(
					new FileInputStream(f.getPath()));
			try {
				Person p = (Person) input.readObject();
				System.out.println(p.getName());
				System.out.println(p.getAge());
				System.out.println(p.getPwd());
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//  
	public static void main(String[] args) {
		TestSerializable.serialization();
		TestSerializable.deserialization();
	}

}

3.テスト結果
xplq
10
null
pwd transientのため、シリアル化できません.