美文网首页
Java序列化

Java序列化

作者: Dalvik_ | 来源:发表于2021-08-17 21:21 被阅读0次

    1.java序列化与反序列化的概念

    • 序列化
      将数据结构或者对象转化为二进制的过程
    • 反序列化
      将在序列化过程中生成的二进制转化为数据结构或者对象的过程
    • 持久化
      把数据结构或者对象存储起来 比如:硬盘

    序列化方案:
    1.Serializable Java的序列化方案
    2.Parcelable Android独有
    3.json xml protbuf ... 广义的序列化

    2.Serializable接口及使用实例

    1.Serializable是一个接口

    public interface Serializable { 
    
    } 
    
    • Serializable序列化
     /**
         * 序列化对象 ** @param obj * @param path * @return
         */
        synchronized public static boolean saveObject(Object obj, String path) {
            if (obj == null) {
                return false;
            }
            ObjectOutputStream oos = null;
            try {
                // 创建序列化流对象 
                oos = new ObjectOutputStream(new FileOutputStream(path));
                //序列化
                oos.writeObject(obj);
                oos.close();
                return true;
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (oos != null) {
                    try {
                        // 释放资源
                        oos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return false;
        }
    
    • Serializable反序列化
     synchronized public static <T> T readObject(String path) {
            ObjectInputStream ojs = null;
            try {
                // 创建反序列化对象 
                ojs = new ObjectInputStream(new FileInputStream(path));
                // 还原对象
                return (T) ojs.readObject();
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            } finally {
                if (ojs != null) {
                    try {// 释放资源
                        ojs.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }
    

    2.Externalizable 是Serializable的一个子类

    public interface Externalizable extends Serializable { 
        void writeExternal(ObjectOutput var1) throws IOException; 
        void readExternal(ObjectInput var1) throws IOException, 
    }
    

    3.序列化面试常见问题

    1. 什么是SerialVersionUID?如果不定义这个,会发生什么?
      序列化对象的版本号
      如果修改序列化对象的数据,可能会导致异常
      2.序列化时,如何不序列化某些变量不序列化
      transient 关键字
      3.如果对象没有实现Serializable接口,去序列化会出现什么情况?
      会报错 NoSerializableException

    4.序列化源码流程解析


    序列化流程 判断对象中是否写了readObject和writeObject

    5.android的Parcelable相关概念

    Binder通信机制

    6.Parcelable与Serializable的性能比较

    • Serializable性能分析
      Serializable是Java中的序列化接口,其使用起来简单但开销较大(因为Serializable在序列化过程中使
      用了反射机制,故而会产生大量的临时变量,从而导致频繁的GC),并且在读写数据过程中,它是通
      过IO流的形式将数据写入到硬盘或者传输到网络上。
    • Parcelable性能分析
      Parcelable则是以IBinder作为信息载体,在内存上开销比较小,因此在内存之间进行数据传递时,推荐使用Parcelable,而Parcelable对数据进行持久化或者网络传输时操作复杂,一般这个时候推荐使用


      Parcelable与Serializable比较

    相关文章

      网友评论

          本文标题:Java序列化

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