为什么JAVA要实现对象序列化?
简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)。在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的!
代码演示:
第一步:创建我要序列化和反序列化的类:
package com.rocy.pojo; import java.io.Serializable; public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private String city; private int age; private String describe; public Person(String name, String city, int age, String describe) { this.name = name; this.city = city; this.age = age; this.describe = describe; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getDescribe() { return describe; } public void setDescribe(String describe) { this.describe = describe; } @Override public String toString() { return this.getName() + " " + this.getCity() + " " + this.getAge()+" "+this.describe +" "+serialVersionUID; } }
第二步:序列化和反序列化测试:
public class Test { public static void main(String[] args) throws Exception { // 序列化过程: // 1 使用FileOutputStream 输出流创建 ObjectOutputStream 从而对对象进行流操作 ObjectOutputStream outObj = new ObjectOutputStream( new FileOutputStream("d://a.txt")); // 2 创建一个对象 Person person = new Person("rocyx", "beijing", 20, "美女"); // 3 将对象写入文件 outObj.writeObject(person); // 4 刷新流中缓冲 outObj.flush(); // 5 关闭流 outObj.close(); // ---序列化 结束 。 这个时候就将流对象输出到了文件中了 // 反序列化过程 // 1 创建一个输入流 ObjectInputStream inObj = new ObjectInputStream(new FileInputStream( "d://a.txt")); // 2 将文件中数据读取并返回对象 Object obj = inObj.readObject(); // 3 关闭流 inObj.close(); // --- 反序列化结束,这个时候可以打印该对象信息,该对象就是序列化到文件中的内容。 obj = (Person) obj; System.out.println("[" + obj.toString() + "]"); } }
对于不想被反序列化的字段可以用 transient 关键字,凡是使用transient 的字段在反序列化的时候都被忽略
可以将Person的一个字段,如:private transient String city;
再次运行Test,这个时候,city字段打印出null,没有被反序列化出来。