对象序列化的目标是将对象保存在磁盘中或者允许在网络中直接传输对象。对象序列化机制循序把内存中的java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点。其他程序一旦获得了这种二进制流,都可以将这种二进制流恢复成原来的java对象。
对象序列化样例:
public class People implements Serializable { public People(String name,String sex) { this.name = name; this.sex = sex; } private String name ; private String sex; public String getName() { return name; } public String getSex() { return sex; } @Override public String toString() { return "我的名字:"+name+" "+"我的性别是:"+sex; } } public class SerializableTest { /** * 对象序列化到磁盘文件中 */ @Test public void writeObject() { try ( //ObjectOutputStream是一个处理流,构造的时候需要节点流 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("G://test//people.txt")); ) { oos.writeObject(new People("张三","男")); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 反序列化 * */ @Test public void readObject() { try ( ObjectInputStream ois = new ObjectInputStream(new FileInputStream("G://test//people.txt")); ) { People p = (People)ois.readObject(); System.out.println(p.toString()); } catch (Exception e) { e.printStackTrace(); } } }
对象引用的序列化:如果有一个类的的属性是应用类型,那么这个引用类必须是可序列化的。当序列化该类时,程序会顺便属性字段的对象也进行序列化。
如果某个类含有敏感信息,例如银行账户信息等,这时不希望系统将该字段序列化,则通过transient关键字修饰Field,则该Field不会被序列化。