序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。对象---流数据(ObjectOutputStream)
反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。 流数据----对象(ObjectInputStream)
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectStreamDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 由于我们要对对象进行序列化,所以我们先自定义一个类
// 序列化数据其实就是把对象写到文本文件
write();
read();
}
private static void read() throws IOException,ClassNotFoundException {
// 创建反序列化对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
"oos.txt"));
//还原对象
Object obj = ois.readObject();
//释放资源
ois.close();
//输出对象
System.out.println(obj);
}
private static void write() throws IOException {
// 创建序列化对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
"oos.txt"));
//创建对象
Person p = new Person("wangkai",21);
// public final void writeObject(Object obj)
oos.writeObject(p);
//释放资源
oos.close();
}
}
import java.io.Serializable;
public class Person implements Serializable{
private static final long serialVersionUID = 6004262518330849208L;
private String name; //transient
private transient int age; //transient
/**
*
*/
public Person() {
super();
}
/**
* @param name
* @param age
*/
public Person(String name, int age) {
super();
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;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
transient使用总结:
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。