深入浅出javase——序列化

/*

* 序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 -- 流数据(ObjectOutputStream)

* 反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 -- 对象(ObjectInputStream)

*/

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("林青霞", 27);

// public final void writeObject(Object obj)

oos.writeObject(p);

// 释放资源

oos.close();

}

}


/*

* NotSerializableException:未序列化异常

*

* 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。

* 该接口居然没有任何方法,类似于这种没有方法的接口被称为标记接口。

*

* java.io.InvalidClassException:

* cn.itcast_07.Person; local class incompatible:

* stream classdesc serialVersionUID = -2071565876962058344,

* local class serialVersionUID = -8345153069362641443

*

* 为什么会有问题呢?

* Person类实现了序列化接口,那么它本身也应该有一个标记值。

* 这个标记值假设是100。

* 开始的时候:

* Person.class -- id=100

* wirte数据: oos.txt -- id=100

* read数据: oos.txt -- id=100

*

* 现在:

* Person.class -- id=200

* wirte数据: oos.txt -- id=100

* read数据: oos.txt -- id=100

* 我们在实际开发中,可能还需要使用以前写过的数据,不能重新写入。怎么办呢?

* 回想一下原因是因为它们的id值不匹配。

* 每次修改java文件的内容的时候,class文件的id值都会发生改变。

* 而读取文件的时候,会和class文件中的id值进行匹配。所以,就会出问题。

* 但是呢,如果我有办法,让这个id值在java文件中是一个固定的值,这样,你修改文件的时候,这个id值还会发生改变吗?

* 不会。现在的关键是我如何能够知道这个id值如何表示的呢?

* 不用担心,你不用记住,也没关系,点击鼠标即可。

* 你难道没有看到黄色警告线吗?

*

* 我们要知道的是:

* 看到类实现了序列化接口的时候,要想解决黄色警告线问题,就可以自动产生一个序列化id值。

* 而且产生这个值以后,我们对类进行任何改动,它读取以前的数据是没有问题的。

*

* 注意:

* 我一个类中可能有很多的成员变量,有些我不想进行序列化。请问该怎么办呢?

*/

public class Person implements Serializable {

private static final long serialVersionUID = -2071565876962058344L;

private String name;

// private int age;

private transient int age;

// int age;

public Person() {

super();

}

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 + "]";

}

}


分享到:


相關文章: