import java.io.*;
class ObjectStreamDemo
{
public static void main(String[] args) throws Exception, IOException, ClassNotFoundException
{
setObjectStream();
getObjSetStream();
}
public static void setObjectStream() throws IOException
{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));
oos.writeObject(new Person("zhangsan", 20)); //对象的本地持久化存贮.将对象记录到文件,需要用ObjectInpuStream来读取.
oos.writeObject(new Person("lisi", 30));
oos.writeObject(new Person("wangwu", 25));
oos.close();
}
public static void getObjSetStream() throws Exception, IOException, ClassNotFoundException
{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt")); //修改Person类后,读取的还是老文件,现在Person.class对应同一个UID值,现在也可以读取数据.
Person p1 = (Person)ois.readObject();
Person p2 = (Person)ois.readObject();
Person p3 = (Person)ois.readObject();
System.out.println(p1.toString());
System.out.println(p2.toString());
System.out.println(p3.toString());
}
}
class Person implements Serializable //标记接口,类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。
{ //对象进行了修改,则其对应的UID变化,记录到新文件(obj1.txt),如果读取的还是记录老版本对修改象的文件(obj.txt),就会抛出异常:
//Exception in thread "main" java.io.InvalidClassException: Person; local class in
//compatible: stream classdesc serialVersionUID = 4491012183083119912, local class
//serialVersionUID = 4802475284912361980
//两次的类文件.class的serialVersionUID不一致,这时候,需要我们手动指定serialVersionUID的值.
public static final long serialVersionUID = 42L; //自定义serialVersionUID,修改类时,读老版本文件可以读出.
//什么时候定义该UID号?如果类的修改不大,为了避免运行时抛出异常,就需要定义自己的UID号,使得不同版本的类文件指向同一个ID.
//不需要进行存贮的字段,需要用static、transient修饰.
private transient String name; //transient - 瞬态
private int age;
private int num; //修改的部分.
Person(String name, int age)
{
this.name = name;
this.age = age;
}
public String toString()
{
return "name=" + name + ", age=" + age;
}
}