黑马程序员技术交流社区
标题:
【记录】代码练习-序列化和反序列化流
[打印本页]
作者:
Kevin.Kang
时间:
2015-7-30 13:20
标题:
【记录】代码练习-序列化和反序列化流
序列化和反序列化:
package com.kxg_02;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/*
* 序列化流:把对象按照流一样的方式存入文本文件或者网络中传输。 对象--流数据(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"));
try {
// 不知道要运行几次用while,最后会报一个EOFException的错误,自己做一下处理就行。
while(true)
{
Object obj = ois.readObject();
System.out.println(obj);
}
} catch (EOFException e) {
System.out.println("反序列化结束!");
}
}
private static void write() throws IOException {
// 创建序列化流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
"oos.txt"));
// 创建对象
Person p1 = new Person("李延旭", 20);
Person p2 = new Person("任兴亚", 23);
Person p3 = new Person("赵磊", 20);
Person p4 = new Person("王澳", 21);
// 把对象添加到流中
oos.writeObject(p1);
oos.writeObject(p2);
oos.writeObject(p3);
oos.writeObject(p4);
oos.close();
}
}
复制代码
作者:
Kevin.Kang
时间:
2015-7-30 13:22
本帖最后由 Kevin.Kang 于 2015-7-30 13:27 编辑
对象类:
Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常
package com.kxg_02;
import java.io.Serializable;
/*
* 需要进行序列化和反序列化的类必须实现Serializable接口
* 该接口没有任何方法,类似于这种没有方法的接口被称为标记接口
*
* 类还需要添加一个serialVersionUID
*/
public class Person implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private int 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 + "]";
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
}
复制代码
使用transient关键字修饰的成员变量就不能进行序列化
作者:
风一样的少年
时间:
2015-7-30 13:53
感觉很深奥
作者:
耀阳圣尊
时间:
2015-7-30 15:20
赞一赞
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2