zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    C#基础知识整理:C#类和结构(1)
    C#窗体读取EXCEL存入SQL数据库
    C# 编码标准(一)
    C# 网络编程之webBrowser获取网页url和下载网页中图片
    【转】100个比较实用的促销方案
    Linux之JDK1.8的安装
    【转】Ubuntu做日常开发电脑的系统是一种怎样的体验
    Shell学习---Shell脚本的静态检查工具shellcheck
    【转】Nginx学习---Nginx&&Redis&&hcache三层缓存架构总结
    【转】MySQL双主一致性架构优化
  • 原文地址:https://www.cnblogs.com/googlemeoften/p/4987788.html
Copyright © 2011-2022 走看看