JAvaでオブジェクトをシーケンス化してファイルに保存する簡単な手順

3569 ワード

なぜシーケンス化するのですか?
1つのオブジェクトまたは大規模なデータ型を保存する場合、プラットフォームの違い(例えばオペレーティングシステムの違い)のため、ネットワークを通じて伝達する必要がある場合、相手の環境またはネットワークのプロトコルに適応する必要があるため、オブジェクトのデータを標準的なバイトストリームシーケンスに変換し、他のプラットフォームで復元し、ネットワーク伝送の要求に合致することができる.
すべての分散アプリケーションは、プラットフォーム間、ネットワーク間を必要とすることが多いため、すべての伝達パラメータ、戻り値がシーケンス化される必要があります.
簡単に言えば、
シーケンス化:Javaオブジェクトをバイトシーケンスに変換するプロセス.
逆シーケンス化:バイトシーケンスをJavaオブジェクトに復元するプロセス.
簡単な例を次に示します.
Studentクラス、3つのメンバー変数id、name、hobby、および静的変数sexを作成します.ここで、hobbyにはシーケンス化に関与しないキーワードtransientが追加されています.
無パラメトリック構造法と2つのパラメータの構造法,toStringの書き換え,およびいくつかのset,get法.
public class Student implements Serializable{
	private int id;;
	private String name;
	public static String sex=" ";
	public transient String hobby="   ";
	public Student() {
		this.id=1;
	}
	public Student(int id, String name) {
		super();
		this.id = id;
		this.name = name;
		this.id=2;
	}
	
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name +",sex="+sex+ ",hobby="+hobby+"]";
	}

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getHobby() {
		return hobby;
	}
	public void setHobby(String hobby) {
		this.hobby = hobby;
	}
	
	
}

最初のテスト方法:
public class Test {
	public static void main(String[] args) throws Exception {
		Student student = new Student(1, "     ");
		System.out.println(student);
		student.sex=" ";
		student.setId(3);
		student.setHobby("   ");
		FileOutputStream fos=new FileOutputStream("F:"+File.separator+"TestFiles"+File.separator+"MyTest.txt");		
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(student);
		System.out.println(student);
		oos.close();
		
		FileInputStream fis = new FileInputStream("F:"+File.separator+"TestFiles"+File.separator+"MyTest.txt");
		ObjectInputStream ois = new ObjectInputStream(fis);
		Student student2= (Student) ois.readObject();
		System.out.println(student2);
		
	}
}

結果:
Student[id=2,name=麗日御茶子,sex=女,hobby=食べる]
Student[id=3,name=麗日御茶子,sex=男,hobby=遊び]
Student[id=3,name=麗日御茶子,sex=男性,hobby=null]
2番目のテスト:
最初のプログラムはすでに実行済みで、前のコードを削除して、直接読み取ります.
public class Test {
	public static void main(String[] args) throws Exception {
		
		FileInputStream fis = new FileInputStream("F:"+File.separator+"TestFiles"+File.separator+"MyTest.txt");
		ObjectInputStream ois = new ObjectInputStream(fis);
		Student student2= (Student) ois.readObject();
		System.out.println(student2);
		
	}
}

結果:
Student[id=3,name=麗日御茶子,sex=女性,hobby=null]
1回目のテスト結果:
最初の結果から見ると、最初に印刷されたのはデフォルトのインスタンス化された結果です.
2回目の変数設定後の印刷でも問題ありません
3回目の印刷でhobbyがnullになったことに気づきました
理由:transient修飾変数はシーケンス化に関与せず、Stringのデフォルト値はnull、数値は0
2回目のテスト結果:
性別は女になって、idはまだ3で、hobbyはnullです
理由:idはシーケンス化前に3に設定されており、シーケンス化後にこの値が保存され、再読み込みは依然として3であり、構造方法は実行されていないため、逆シーケンス化は構造方法を実行しないと結論された.
hobbyはtransientを加えたためシーケンス化に参加せず保存されなかった.
sexは元の値女に戻ったが、1回目のテストで3回目の印刷の結果は男で、1回目のテストではjvmが停止していないため、メソッド領域でsexの値が設定されて確かに男になったが、静的変数はシーケンス化に関与しないため、1回目のテストプログラムで逆シーケンス化対象を読み取る場合、すべてStudentクラスなので同じアドレスの値を使用していますが、sexというアドレスの値は変更されているので、印刷の結果も変更されます.2回目のテストではjvmが再起動され、元のメソッド領域のsexのアドレスが消え、逆シーケンス化オブジェクトを読み込むとクラスロードが1回行われ、ロード時にはStudioに書かれたstaticのデフォルト値に従ってアドレスとデフォルト値が再割り当てされるので、読み込まれた結果が元の値になります.