美文网首页
Java 序列化

Java 序列化

作者: 01_小小鱼_01 | 来源:发表于2018-06-23 23:34 被阅读5次

    Java序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程。一般的要实现Java对象序列化就需要实现Serializbale 接口。

    那么为什么需要序列化呢?

    • 第一种情况是:一般情况下Java对象的声明周期都比Java虚拟机的要短,实际应用中我们希望在JVM停止运行之后能够持久化指定的对象,这时候就需要把对象进行序列化之后保存。
    • 第二种情况是:需要把Java对象通过网络进行传输的时候。因为数据只能够以二进制的形式在网络中进行传输,因此当把对象通过网络发送出去之前需要先序列化成二进制数据,在接收端读到二进制数据之后反序列化成Java对象。

    一个简单的序列化示例:

    public class SerializableTest {
        public static void main(String[] args) throws Exception {
            FileOutputStream fos = new FileOutputStream("temp.out");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            TestObject testObject = new TestObject();
            oos.writeObject(testObject);
            oos.flush();
            oos.close();
             
            FileInputStream fis = new FileInputStream("temp.out");
            ObjectInputStream ois = new ObjectInputStream(fis);
            TestObject deTest = (TestObject) ois.readObject();
            System.out.println(deTest.testValue);
            System.out.println(deTest.parentValue);
            System.out.println(deTest.innerObject.innerValue);
        }
    }
     
    class Parent implements Serializable {
        private static final long serialVersionUID = -4963266899668807475L;
        public int parentValue = 100;
    }
     
    class InnerObject implements Serializable {
        private static final long serialVersionUID = 5704957411985783570L;
        public int innerValue = 200;
    }
     
    class TestObject extends Parent implements Serializable {
        private static final long serialVersionUID = -3186721026267206914L;
        public int testValue = 300;
        public InnerObject innerObject = new InnerObject();
    }
    

    注意点:

    • 如果一个类想被序列化,需要实现Serializable接口。否则将抛出NotSerializableException异常,这是因为,在序列化操作过程中会对类型进行检查,要求被序列化的类必须属于Enum、Array和Serializable类型其中的任何一种。
    • 通过ObjectOutputStream和ObjectInputStream对对象进行序列化及反序列化
    • 序列化并不保存静态变量
    • Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null

    相关文章

      网友评论

          本文标题:Java 序列化

          本文链接:https://www.haomeiwen.com/subject/hgpdyftx.html