Java シリアル化
シリアル化を簡単に理解すると、シリアル化は、シリアル化するクラス内のすべてのものをファイル内のデータ ストリームに保存することと同じです。たとえば、ゲームをプレイするときに一時停止や終了などを行う必要があります。このときゲームの状態を保存する必要があり、次回ゲームをプレイするときに直接ゲームを続行することで現在の状態に戻すことができます。(一部の拷問ゲームにはゲームを保存する機能がありません。) また、二次元の太陽系を絵画に保存することも考えられます。三次元の太陽系に戻ります。
ただし、シリアル化したい場合は、まずクラスがシリアル化をサポートする必要があります。言い換えれば、シリアル化されたものは、シリアル化できるインターフェイス Serializable を実装する必要があります。シリアル化自体は IO フローと切り離せないため、IO の動作を理解する必要があります。
1.連載
package com.Unit1;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class RunTest05 {
public static void main(String[] args) throws Exception {
//首先表示作为一个文件输出。
FileOutputStream outputStream = new FileOutputStream("E:\\student.txt");
ObjectOutputStream out = new ObjectOutputStream(outputStream);
//生成Student对象
Student stu = new Student("徐凤年", 21);
//将stu对象序列化并写到上面提到的文件路径中。
out.writeObject(stu);
//记得关闭流
out.close();
outputStream.close();
}
}
class Student implements Serializable {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
この時、E:\student.txtが自動生成されるのですが、開いてみると文字化けが発生しています。
2. デシリアライゼーション
では、保存したデータを読み出すにはどうすればよいでしょうか?逆シリアル化を使用します。原理は同じですが、1 つは書き込み用、もう 1 つは読み取り用です。シリアル化も、やや特殊な IO ストリーム操作です。
逆シリアル化は、ファイルやオブジェクトなどから保存したデータの一部を取り出すことと同じです。どのようなクラスを使用して書き込んだのか、そして今はどのようなクラスを使用して受信しているのか。読み出されるのは Object クラスだけです。上方変換が必要です。
package com.Unit1;
import java.io.*;
public class RunTest05 {
public static void main(String[] args) throws Exception {
//首先指定文件路径
FileInputStream inputStream = new FileInputStream("E:\\student.txt");
ObjectInputStream in = new ObjectInputStream(inputStream);
//因为是 readObject(),所以读出来的肯定是一个Object类。我们需要进行强转
Student stu2 = (Student) in.readObject();
//我们读一下刚才存进去的数据,看对不对
System.out.println("姓名 :" + stu2.getName());
System.out.println("年龄 :" + stu2.getAge());
//记得关闭流
in.close();
inputStream.close();
}
}
class Student implements Serializable {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
結果: