Java的序列化机制

1. 所有实现序列化的类都必须实现Serializable接口,序列化有如下两个特点:

  • 如果一个类可以被序列化,那么它的子类也可以被序列化
  • 由于static代表类成员,trasient代表对象的临时数据,因此被声名为这两种类型的数据成员是不能被序列话的

2. 序列化和反序列化的实例

package StreamLearn;

import java.io.*;

/**
 * Created by liujinhong on 2017/3/6.
 */

/**
 * 序列化和返序列化实例
 */
public class SerialObjectTest {
    public static void main(String[] args) {
        People p = new People();
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;

        //序列化
        try {
            FileOutputStream fos = new FileOutputStream("/Users/liujinhong/Desktop/test/ttt");
            oos = new ObjectOutputStream(fos);

            oos.writeObject(p);
        } catch (Exception e) {
            System.out.println(e);
        } finally {

        }

        //反序列化
        People p1;
        try {
            FileInputStream fis = new FileInputStream("/Users/liujinhong/Desktop/test/ttt");
            ois = new ObjectInputStream(fis);

            p1 = (People) ois.readObject();

            System.out.println(p1.a);
            System.out.println(p1.b);
            System.out.println(p1.book.id);
        } catch (Exception e) {
            System.out.println(e);
        } finally {

        }
    }
}


class People implements Serializable {
    public int a = 1;
    public transient int b = 2;
    public Book book = new Book();
}

class Book implements Serializable {
    public int id = 1;
}

3. 什么情况下需要使用序列化?

  • 通过网络来发送对象,或对象的状态需要被持久化到数据库或文件中
  • 序列化能实现深复制,即可以复制引用的对象

4. serialVersionUID作用?

在序列化和反序列化的过程中,serialVersionUID起着非常重要的作用,每一个类都有一个特定的serialVersionUID,在反序列化的过程中通过serialVersionUID来判断类的兼容性。如果不兼容会跑出InvalidClassException异常。

5. 自定义serialVersionUID的优点?

  • 提高程序运行效率
  • 提高程序在不同平台上的兼容性
  • 增强各个版本的可兼容性
posted @ 2017-03-06 10:38  Black_Knight  阅读(558)  评论(0编辑  收藏  举报