【深入Java基础】序列化和反序列化

序列化对象

Java中的对象是伴随jvm而存在的,当虚拟机运行结束后,这些对象也随即被释放,当我们需要将这些对象保存时,就需要序列化这些对象(保存为文件存在磁盘上)

要实现序列化,则需要类实现Serializable接口。

如下,C类实现了Serializable接口,则这个类是可序列化的。

        class C implements Serializable{
            private int a;
            private String b;

            public int getA() {
                return a;
            }

            public void setA(int a) {
                this.a = a;
            }

            public String getB() {
                return b;
            }

            public void setB(String b) {
                this.b = b;
            }

        }

利用ObjectOutputStream序列化对象c:

    public static void main(String[] agrs) throws IOException {
        C c = new C();
        c.setA(1);
        c.setB("哈哈哈");
        File file = new File("C:\Users\Administrator\Desktop\C.out");
        FileOutputStream fo = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fo);
        oos.writeObject(c);
        oos.close();
     }

这样在指定路径下就保存了这个对象。其中c.out的后缀名可以任意。

反序列化

序列化将对象保存在磁盘上,而反序列化则可以从磁盘读取一个文件将它转化为对象。当然这个文件是需要由序列化方式得到的。

    public static void main(String[] agrs) throws IOException, ClassNotFoundException {
        FileInputStream fi = new FileInputStream(file);
        ObjectInputStream ooi = new ObjectInputStream(fi);
        C cc = (C)ooi.readObject();
        System.out.println(cc.getB());
    }

输出结果:

1
哈哈哈

这样就将一个文件转化为了一个对象。

什么时候需要序列化?

序列化将对象以二进制的形式保存在文件中,可以在网络中传输这个对象,所以可以用于远程方法调用(RMI)

序列化之transient关键字

在序列化的或称中,如果成员变量中有List、map等集合对象,则在序列化的时候也会对集合内的对象进行序列化,导致效率低下,若我们不需要序列化某个成员变量,则只需要加上transient关键字即可。(另外用static修饰的变量也是不参与序列化的,因为static是属于类的,而不属于某个对象的)

原文地址:https://www.cnblogs.com/cnsec/p/13286698.html