本文简要说明Java中对象的序列化和反序列化的基本操作,基于ObjectInputStream和ObjectOutputStream。
1、JavaBeans:
import java.io.Serializable;
public class Cat implements Serializable {
private static final long serialVersionUID = -7955255083446408893L;
private String name;
private String age;
public Cat() {}
public Cat(String name, String age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(String age) {
this.age = age;
}
public String getAge() {
return age;
}
}
说明:
- 用于保存数据的JavaBeans;
- 提供属性的存取方法;
- 为了可以被序列化和反序列化需要实现Serizlizable接口;
2、序列化和反序列化代码:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializeCat {
public static void main(String[] args) {
Cat c = new Cat("CatName", "Age");
FileOutputStream fs = null;
ObjectOutputStream os = null;
try {
fs = new FileOutputStream("cat.obj");
os = new ObjectOutputStream(fs);
os.writeInt(131422);
os.writeObject(c);
os.writeChar('A');
os.writeObject("This is a string!");
fs.flush();
os.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fs != null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis = new FileInputStream("cat.obj");
ois = new ObjectInputStream(fis);
System.out.println(ois.readInt());
Cat cat = (Cat) ois.readObject();
System.out.println(cat.getName());
System.out.println(cat.getAge());
System.out.println(ois.readChar());
System.out.println((String)ois.readObject());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
说明:
- 代码11~40完成序列化操作;
- 代码42~70完成反序列化操作;
- 注意try-catch代码块中的序列化和反序列化的顺序;
3、多说一点:
- 轻量级持久性(lightweight persistence):需要用代码显式的序列化和反序列化;
- 对象序列化被引入的原因是:Java的运程方法调用(Remote Method Invocation,RMI)和对JavaBeans支持;
- 被序列化的对象所属类需要实现Serializable接口;
- 基于字节进行序列化和反序列化;