第十九章:对象序列化
对象序列化概念
几乎只要是java开发就一定会存在有序列化的概念,而正是因为序列化的概念逐步发展,慢慢也有了更多的序列化标准。
所谓的对象序列化指的是将内存中保存的对象以二进制数据流的形式进行处理,可以实现对象的保存或者是网络传输。
然而并不是所有的对象都可以被序列化,在Java里面有一个强制性的要求:如果要序列化的对象,那么对象所在的类一定要实现java.io.Serializable父接口,作为序列化的标记,这个接口并没有任何的方法,因为它描述的是一种能力。
序列化与反序列化处理
有了序列化的支持类之后如果要想实现序列化与反序列化的操作则就可以利用一下两个类完成:
class Person implements Serializable{//此时Person类产生的每一个对象都可以实现二进制的数据传输 //出现警告,设置一个序列化版本编号,一般意义不大,可以注解压制 属于可以被序列化的程序类 private static final long serialVersionUID = 1L; private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } } public class JavaAPIDemo { private static final File SAVE_FILE = new File("D:\\mldn.txt"); public static void main(String[] args) throws Exception { saveObject(new Person("小喷嚏",78)); //序列操作 System.out.println(loadObject()); //反操作 } public static void saveObject(Object obj) throws Exception { ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(SAVE_FILE)); oos.writeObject(obj); //序列化 oos.close(); } public static Object loadObject() throws Exception { ObjectInputStream ois = new ObjectInputStream( new FileInputStream(SAVE_FILE)); Object obj = ois.readObject(); //反序列化 ois.close(); return obj; } }
java中的对象序列化与反序列化必须使用内部提供的对象操作流,因为这里面牵扯到二进制数据的格式,所以不能自定义处理,另外如果要想实现一组对象的序列化,则可以使用对象数组完成。
在很多的实际项目开发过程中,开发者很少能见到ObjectOutputStream、ObjectInputStream类的直接操作,因为会有一些容器帮助开发者自动实现。我们只需要关注实现Seriazible接口。
transient关键字
默认情况下当执行了对象序列化的时候会将类中的全部属性的内容进行全部的序列化操作,但是很多情况下有很多属性并不需要进行序列化的处理,这个时候就可以在熟悉定义上使用transient关键之来完成了
在进行序列化处理的时候name属性的内容是不会被保存下来的,换言之读取的数据将是对应数据类型的默认值“null”。如果假设类之中有一些是需要保存的属性内容往往是不需要被序列化的,这个时候就可以使用transient,但是在实际的开发之中大部分需要被序列化的类往往都是简单java类,所以这一个关键字的出现频率并不高