处理流之对象流 ObjectInputStream,ObjectOutputStream
用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
序列化:用ObjectOutputStream类保存基本类型数据或对象的机制 反序列化:用ObjectInputStream类读取基本类型数据或对象的机制
不能序列化static和transient修饰的成员变量(所以一个类中要是有属性不想被序列化,那就贴上这俩个标签吧~)
import org.junit.Test;
import java.io.*;
public class ObjectStream {
@Test
public void test1()
{
ObjectOutputStream oos= null;
try {
oos = new ObjectOutputStream(new FileOutputStream("object.txt"));
oos.writeObject(new String("我好菜"));
oos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(oos!=null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Test
public void test2()
{
ObjectInputStream ois=null;
try {
ois=new ObjectInputStream(new FileInputStream("object.txt"));
Object obj=ois.readObject();
String str=(String) obj;
System.out.println(str);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if(ois!=null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
NOTE: 要想一个java对象是可序列化的,需要满足相应的要求。 eg。Person类
1. 需要实现接口:Serializable 2. 当前类提供一个全局变量:serialVersionUID 3. 除了当前person类要实现Serializable接口之外,还必须保证其内部所有属性也必须是可序列化的。 比如String,基本数据类型
public class Person implements Serializable {
private String name;
private int age;
public static final long serialVersionUID=82349802L;
-
serialVersionUID用来表明类的不同版本间的兼容性。简言之,其目的是以序列化对象进行版本控制,有关各版本反序列化时是否兼容。 -
如果类没有显示定义这个静态变量,它的值是Java运行时环境根据类的内部细节自动生成的。若类的实例变量做了修改,serialVersionUID可能发生变化。故建议,显式声明。 -
Java反序列化机制是通过运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为一致,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidCastException)
(改了类的内部以后这个UID也不会变!)
|