对象流
ObjectInputStream和ObjectOutputStream
用于存储和读取对象的处理流。它的强大之 处在于可以把java中的对象写入到数据源中,也能把对象从数据源中还原会来。
序列化:用ObjectOutputStream类将一个java对象写入IO流中。
反序列化:用ObjectInputStream类从IO流中恢复该java对象。
注意:ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量。
对象的序列化
- 对象的序列化机制允许把内存中的java对象转化成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上或者通过网络将这种二进制流传输到另一个网络节点。当其他的程序获取到这种二进制流,可以恢复成原来的java对象。
- 序列化的好处在于可将任何实现了Serializable接口的对象转化为字节数据,使其保存和传输时可以被还原。
- 序列化是RMI(远程方法调用)过程的参数和返回值都必须实现的机制,而RMI是javaEE的基础。因此序列化机制是javaEE平台的基础。
- 如果需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:
1、Serializable
2、Externalizable - 凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:
private static final long serialVersionUID;
serialVersionUID用来表明类的不同版本间的兼容性
如果类没有显示定义这个静态变量,它的值是Java运行时环境根据类的内部细节自动生成的。若类的源代码作了修改,serialVersionUID 可能发生变化。故建议,显示声明 - 显示定义serialVersionUID的用途
希望类的不同版本对序列化兼容,因此需确保类的不同版本具有相同的serialVersionUID
不希望类的不同版本对序列化兼容,因此需确保类的不同版本具有不同的serialVersionUID
/** * 要实现序列化的类 * 属性也要实现序列化 * 提供一个版本号 private static final long serialVersionUID * */ class Person implements Serializable{ private static final long serialVersionUID=293789237458923L; String name; Integer age; public Person(String name, Integer age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public class ObjectStream { /** * 序列化的过程 */ @Test public void ObjectOutputStream() { Person p1 = new Person("小米",23); Person p2 = new Person("小红",34); ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(new FileOutputStream("F:/test/1.txt")); oos.writeObject(p1); oos.flush(); oos.writeObject(p2); oos.flush(); } catch (IOException e) { e.printStackTrace(); } finally { if (oos!=null){ try { oos.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 反序列化的过程:将硬盘中的文件通过ObjectInputStream转化为相应的对象 */ @Test public void ObjectInputStream(){ ObjectInputStream ois = null; try { ois = new ObjectInputStream(new FileInputStream("F:/test/1.txt")); Person p1 = (Person) ois.readObject(); System.out.println(p1); Person p2 = (Person) ois.readObject(); System.out.println(p2); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { if (ois!=null){ try { ois.close(); } catch (IOException e) { e.printStackTrace(); } } } } }