Java之对象序列化和反序列化

一、对象序列化和反序列化存在的意义:

  当你创建对象,只要你需要,他就一直存在,但当程序结束,对象就会消失,但是存在某种情况,如何让程序在不允许的状态,仍然保持该对象的信息。并在下次程序运行的时候使用该信息。

二、Java如何序列化和反序列化

  Java对象的序列化是将那些实现Serializable接口的对象转化成一个字节序列。并在以后将该字节序列完全恢复成对象。该过程可以通过网络进行,这也是序列化机制能够自动弥补不同

操作系统之间的差异:在windows平台上序列化,通过网络传输给Linux系统,进行重新组装。

三、序列化IO流:

  涉及到信息的保存机制就一定与IO流有关,在序列化一个对象时,首先创建OutputStream,然后将其封装到ObjectOutputStream,这是调用writeOject()就可以序列化对象。反序列化是将一个InputStream对象封装到ObjectInputStream中,将字节序列还原为对象。(还原过程中不会调用任何的构造器)

  对象序列化特别聪明的地方就是能够追踪对象包含的所有的引用

四、参考代码:

  序列化:

public byte[] getByteFromObject(Object obj) {
        ByteArrayOutputStream output = null;
        ObjectOutputStream oop = null;
        try {
            output = new ByteArrayOutputStream();
            oop = new ObjectOutputStream(output);
            oop.writeObject(obj);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            close(oop);
            close(output);
        }

        return output.toByteArray();
    }

  反序列化:

public Object getObjectFromByte(byte[] bytes) {
        ByteArrayInputStream bis = null;
        ObjectInputStream ois = null;
        Object object = null;
        try {
            bis = new ByteArrayInputStream(bytes);
            ois = new ObjectInputStream(bis);
            object = ois.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            close(ois);
            close(bis);
        }

        return object;
    }

五:序化化的问题:

  我们进行序列化时。可能不希望将一些敏感的内容序列化,如:密码!!!

  这是我们可以使用transient的关键字进行标记,用来防止敏感对象被序列化。同时,还有另外的一种方法用来进行该操作:Externalizable接口

六、Externalizable接口

  Externalizable接口继承了Serializiable接口,同时添加了两个方法:writeExernal()和readExternal()接口,该方法在序列化和反序列化的时候被自动调用

  Externalizable接口与Serializable接口不同,该接口会调用所有的默认构造器,然后调用readExternal();

 

posted @ 2015-11-23 11:15  googlemeoften  阅读(788)  评论(0编辑  收藏  举报