Javaシリアル化


Section 1. シリアル化
1.シリアル化
オブジェクト(インスタンス)を記録可能なフォーマットに変換してファイルに保存したり、他のシステムと送受信したりする方法
  • 、オブジェクトまたはオブジェクトの状態を移動しやすい形状に変換するプロセス
  • .
  • シリアル/逆シリアルは
  • 存在する.
    2.シリアル化のタイプ
        ①バイナリシリアル化-オブジェクトをバイト形式(ストリーム形式)に変換して元の状態を保持(=javaシリアル化)
        ②Jsonシーケンス化-オブジェクトの状態をキー値形式に変換し、システム間で送受信する
        ③XMLシーケンス化-共通プロパティと共通フィールドのみシーケンス化
    3.Javaシリアル化
  • バイナリシリアル化
  • Javaは補助ストリームを利用してシリアル化
  • を提供する.
    ジェネレータの説明ジェネレータのパラメータとしてオブジェクト入出力を受け入れ、ジェネレータのパラメータとしてオブジェクト入出力を作成する
    4.シリアルコネクタ
  • のシリアル化は、インスタンスの内容が外部に漏れることを意味し、シリアル化対象のオブジェクトに
  • を表示することを意図する.
  • 実装コードのないタグインタフェース
  • 過渡-シリアル化したくないメンバー変数(例えば、シリアル化できないオブジェクト)のための
  • .
    5.Javaシリアル化の実現
    ターゲット
  • のPersonクラス定義
  • class Person implements Serializable{
    	
    	private static final long serialVersionUID = -1503252402544036183L;
    
    	String name;
    	String job;
    	
    	public Person() {}
    
    	public Person(String name, String job) {
    		this.name = name;
    		this.job = job;
    	}
    	
    	public String toString()
    	{
    		return name + "," + job;
    	}
    }
  • FileInputStream、FileOutputStreamベースのストリームをObjectStreamにマージ
    public class SerializationTest {
    
    	public static void main(String[] args) throws ClassNotFoundException {
    
    		Person personLee = new Person("이순신", "대표이사");
    		Person personKim = new Person("김유신", "상무이사");
    		
    		try(FileOutputStream fos = new FileOutputStream("serial.out");
    				ObjectOutputStream oos = new ObjectOutputStream(fos)){
    			
    			oos.writeObject(personLee);		# 직렬화하여 write
    			oos.writeObject(personKim);		# 직렬화하여 write
    		
    		}catch(IOException e) {
    			e.printStackTrace();
    		}
    			
    		try(FileInputStream fis = new FileInputStream("serial.out");
    			ObjectInputStream ois = new ObjectInputStream(fis)){
    			
    			Person p1 = (Person)ois.readObject();	# 직렬화된 바이트 데이터 객체화 (역직렬화)
    			Person p2 = (Person)ois.readObject();	# 직렬화된 바이트 데이터 객체화 (역직렬화)
    			
    			System.out.println(p1);
    			System.out.println(p2);
    		}catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }
    
    Section 2. 外部化可能なインタフェース
    1.外部化可能なインタフェース
  • オブジェクトがどのように変換されるかは、プログラマがコード
  • を直接実装することができる.
  • writer ExternalおよびreadExternalメソッド
  • を実装する必要がある
    2.外部化可能なインタフェースの実現
    class Person implements Externalizable{
    	
    	String name;
    	String job;
    	
    	public Person() {}
    
    	public Person(String name, String job) {
    		this.name = name;
    		this.job = job;
    	}
    	
    	public String toString()
    	{
    		return name + "," + job;
    	}
    
    	@Override
    	public void writeExternal(ObjectOutput out) throws IOException {
    		out.writeUTF(name);
    		//out.writeUTF(job);
    	}
    
    	@Override
    	public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
    		name = in.readUTF();
    		//job = in.readUTF();
    	}
    	
    }
    
    3.動作原理
  • はシリアル化され、逆シリアル化時もオブジェクト自体は
  • に変換する.
  • 外部インタフェースは、変換中にメンバー変数の値を他の値
  • に変更することができる.
  • シリアル化
  •     ①出力オブジェクトのメソッド呼び出し=oos.呼び出しwriteObject(PersonLee)
        ②対象のクラスが外部化可能なインタフェースを実現しているかどうかを確認する
        ③実現した場合は、writeExternal()方式で伝送データをシリアル化する
        ④Externalizableインタフェースが実装されていない場合はシリアル化が実施されていることを確認してください
        ⑤実現したら、オブジェクト全体をオブジェクトストリームにシリアル化する
        ⑥どちらも実現していなければ、Exception
  • 逆シリアル化
  •     ① Person p1 = (Person)ois.readObject()を呼び出す
        ②ストリーミングによるオブジェクトが外部化可能なインタフェースを実現しているか確認する
        ③実現した場合、readExternal()メソッドで送信されたデータを順番に読み出し、オブジェクトをシリアル化する
        ④実現していない場合は、シリアルインターフェースによりオブジェクト全体を逆シリアル化する