Java-IO流-对象的序列化和反序列化
2018-07-23 本文已影响8人
码农随想录
接口序列化
import java.io.Serializable;
/*
* 序列化接口的作用:没有方法,不需要覆盖,是一个标记接口为了启动一个序列化功能。
* 唯一作用,给每一个需要序列化的类都分配一个序列版本号。
* 这个版本号和该类相关联。
* 这个版本号有什么用呢?
* 在序列化时,会将这个序列号也异同保存到文件中。
* 在反序列化会读取这个序列化和本类的序列化进行匹配,如果不匹配会抛出异常。java.io.InvalidClassException
* 哦,原来是用于验证的。
*
* 那我们在序列化时,显示定义吗?
*
*
*/
public class Person implements Serializable /*标记接口,用于启动类的序列化功能*/{
private static final long serialVersionUID = 1234567L;
private static String name;// 静态数据是不会被序列化。
private transient/*瞬态*/ int age;//对于一个非静态的数据也不想序列化咋办?需要一个关键字来修饰。transient
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
ObjectOutputStream和ObjectInputStream
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import cn.test.domain.Person;
public class ObjectStreamDemo {
/**
* @param args
* @throws IOException
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws IOException, ClassNotFoundException {
//需求:想要将封装了数据的对象进行持久化。当写入的对象很多对象会按照顺序排列,也称之为对象的序列化。
//1,应该先有对象。Person name age。
//2,往硬盘写数据,进行持久化,需要io技术。输出流。FileOutputStream。
//3,在字节输出流中按照名称规律在api找到一个子类 ObjectOutputStream
//4,在基础流对象上使用额外功能。
// writeObj();
//需求:读取已有的对象文件,并获取对象中的数据。
//通过阅读ObjectOutputStream对象的文档,发现有一个对应的对象ObjectInputStream可以用于读区存储对象的文件
//对象的反序列化。
readObj();
}
public static void readObj() throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream("tempfile/obj.object");
ObjectInputStream ois = new ObjectInputStream(fis);
Object obj = ois.readObject();
System.out.println(obj.toString());
}
public static void writeObj() throws IOException {
Person p = new Person("lisi",20);
FileOutputStream fos = new FileOutputStream("tempfile/obj.object");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
oos.close();
}
}