为什么JAVA要实现对象序列化?
简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)。在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的!
代码演示:
第一步:创建我要序列化和反序列化的类:
package com.rocy.pojo;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String city;
private int age;
private String describe;
public Person(String name, String city, int age, String describe) {
this.name = name;
this.city = city;
this.age = age;
this.describe = describe;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getDescribe() {
return describe;
}
public void setDescribe(String describe) {
this.describe = describe;
}
@Override
public String toString() {
return this.getName() + " " + this.getCity() + " " + this.getAge()+" "+this.describe +" "+serialVersionUID;
}
}
第二步:序列化和反序列化测试:
public class Test {
public static void main(String[] args) throws Exception {
// 序列化过程:
// 1 使用FileOutputStream 输出流创建 ObjectOutputStream 从而对对象进行流操作
ObjectOutputStream outObj = new ObjectOutputStream(
new FileOutputStream("d://a.txt"));
// 2 创建一个对象
Person person = new Person("rocyx", "beijing", 20, "美女");
// 3 将对象写入文件
outObj.writeObject(person);
// 4 刷新流中缓冲
outObj.flush();
// 5 关闭流
outObj.close();
// ---序列化 结束 。 这个时候就将流对象输出到了文件中了
// 反序列化过程
// 1 创建一个输入流
ObjectInputStream inObj = new ObjectInputStream(new FileInputStream(
"d://a.txt"));
// 2 将文件中数据读取并返回对象
Object obj = inObj.readObject();
// 3 关闭流
inObj.close();
// --- 反序列化结束,这个时候可以打印该对象信息,该对象就是序列化到文件中的内容。
obj = (Person) obj;
System.out.println("[" + obj.toString() + "]");
}
}
对于不想被反序列化的字段可以用 transient 关键字,凡是使用transient 的字段在反序列化的时候都被忽略
可以将Person的一个字段,如:private transient String city;
再次运行Test,这个时候,city字段打印出null,没有被反序列化出来。