Javaシーケンス化学習

5250 ワード

一.シーケンス化特徴
1.シーケンス化前のオブジェクトは、通常、瞬時、動的、可変である.シーケンス化後の結果は通常、永続的、静的、可変である.
2.シーケンス化の目的は、通常、オブジェクトを保存したり、転送したりすることである.
3.シーケンス化プロセスは、通常、逆シーケンス化プロセスに対応する.
二.Java Serializable
Javaオブジェクトのメタデータとそのステータスをバイナリ配列として保存します.必要に応じて、バイナリ配列を解析し、オブジェクトを再生成して状態を復元できます.ここでは,対象となる状態を重点的に説明する.オブジェクトのステータスは、実際にはメンバー変数の値であるため、オブジェクトのステータスを保存することは、オブジェクトの値を保存することです.
オブジェクト状態の保存と復元方法を実現した.
方法またはプロセスのリモートコール方法を実現した.
三.serialVersionUIDについて
シーケンス化は、バージョンの互換性を維持するために行われます.すなわち、バージョンのアップグレード時に逆シーケンス化はオブジェクトの一意性を維持します.
2つの生成方法があります.
       1つはデフォルトの1 Lです.たとえば、次のようにします.
      
private static final long serialVersionUID = 1L;

       1つは、クラス名、インタフェース名、メンバーメソッド、およびプロパティなどに基づいて、64ビットのハッシュフィールドを生成します.たとえば、次のようなものです.
      
private static final long serialVersionUID = 3688326153694834789L;

四.java.io.Serializableインタフェースの実現
JDKドキュメントを参照
単純テストコード
package com.my.model;

import java.io.Serializable;

public class User implements Serializable {

	private static final long serialVersionUID = 3688326153694834789L;
	private String name;
	private int age;
	
	public User(){
		
	}
	
	public User(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	
	public int getAge() {
		return age;
	}
	
}
package com.my.util;

import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import com.my.model.User;

public class SerializableToFile {

	public static void main(String[] args) {
		SerializableToFile stf = new SerializableToFile();
		stf.save();
		stf.resove();
	}

	public void save() {
		User[] user = new User[3];
		user[0] = new User("Tom7", 17);
		user[1] = new User("Tom8", 18);
		user[2] = new User("Tom9", 19);
		try {
			FileOutputStream fos = new FileOutputStream("D:\\My Documents\\Downloads\\User.txt");
			ObjectOutputStream oos = new ObjectOutputStream(fos);

			for (int i = 0; i < user.length; i++) {
				System.out.println("<save>User name: " + user[i].getName());
				System.out.println("<save>User Age: " + user[i].getAge());
			}

			oos.writeObject(user);

			oos.flush();
			oos.close();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void resove() {
		try {
			FileInputStream fis = new FileInputStream("D:\\My Documents\\Downloads\\User.txt");
			ObjectInputStream ois = new ObjectInputStream(fis);

			/*
			 * String name = (String)ois.readObject(); int age = ois.readInt();
			 */

			try {
				User[] user = (User[]) ois.readObject();

				if (user != null) {

					for (int i = 0; i < user.length; i++) {
						System.out.println("<resove>User name: " + user[i].getName());
						System.out.println("<resove>User Age: " + user[i].getAge());
					}
				}
			} catch (EOFException e) {
				// TODO: handle exception
				System.out.println("Read file Done!");
			}

			ois.close();

		} catch (Exception e) {

			/*
			 * if(e instanceof EOFException){
			 * 
			 * }
			 */

			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

実行結果
<save>User name: Tom7
<save>User Age: 17
<save>User name: Tom8
<save>User Age: 18
<save>User name: Tom9
<save>User Age: 19
<resove>User name: Tom7
<resove>User Age: 17
<resove>User name: Tom8
<resove>User Age: 18
<resove>User name: Tom9
<resove>User Age: 19

コードの実行中に発生した例外:
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
EOFExceptionをキャプチャする必要があります
while (user != null)
結果はデッドサイクルに変更されました
if (user != null)

参考記事:
Java深度冒険(十)-Javaオブジェクトのシーケンス化とRMI
JAVAにおけるSERIALVERSIONUIDの解釈
Javaシーケンス化の1つ:JAVAシーケンス化とは
Javaシーケンス化のメカニズムと原理、およびカスタムシーケンス化の問題