序列化相关面试题

1.如果一个子类实现了序列化,父类没有实现,那么父类中的成员变量能否被序列化?

不会。

2.transient是干嘛的?有什么方法能够绕过transient的机制?这个实现机制的原理是什么?

transient是干嘛的?

transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化(Java 的序列化方式)到文件中,在被反序列化后,transient 变量的值被设为初始值。

有什么方法能够绕过transient的机制?

虽然 name 被 transient 修饰,但是通过写 writeObject 和 readObject 这两个方法依然能够使得 name 字段正确被序列化和反序列化。

这个实现机制的原理是什么?

在 ObjectInputstrean 和 ObjectOutputStream 里调用了 ObjectStreamClass 里的方法

void invokeReadObject(Object obj, ObjectInputStream in)
        throws ClassNotFoundException, IOException,
               UnsupportedOperationException
    {
        requireInitialized();
        if (readObjectMethod != null) {
            try {
            	//反射调用
                readObjectMethod.invoke(obj, new Object[]{ in });
            } catch (InvocationTargetException ex) {
                Throwable th = ex.getTargetException();
                if (th instanceof ClassNotFoundException) {
                    throw (ClassNotFoundException) th;
                } else if (th instanceof IOException) {
                    throw (IOException) th;
                } else {
                    throwMiscException(th);
                }
            } catch (IllegalAccessException ex) {
                // should not occur, as access checks have been suppressed
                throw new InternalError(ex);
            }
        } else {
            throw new UnsupportedOperationException();
        }
    }

3.serializable的安全性如何保证?

可以在 writeObject 和 readObject 里添加 加密/解密 流程。

4.有没有了解过protobuf,它的序列化实现原理是什么?

Protocol Buffer的性能好,主要体现在序列化后的数据体积小&序列化速度快,最终使得传输效率高,其原因如下

序列化速度快的原因
a.编码/解码方式简单(只需要简单的数学运算=位移等等)
b.采用 Protocol buffer自身的框架代码和编译器共同完成

序列化后的数据量体积小(即数据压缩效果好)的原因
a.采用了独特的编码方式,如 Variant、 Zigzag编码方式等等
b.采用T-L-V数据存储方式:减少了分隔符的使用&数据存储得紧凑

5.serialVersionUID的 作 用 是 什 么?如 果 我 不 设 置serialVersionUID,有没有问题?

serialVersionUID的作用 是 什 么?

Java的序列化机制是通过判断类的 serialversionUID 来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的 serialversionUID 与本地相应实体类的 serialversionUID 进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是 InvalidCastEXception。

如果我不设置serialVersionUID,有没有问题?

如果不设置,Java 编译器会自动生成一个。

©️2020 CSDN 皮肤主题: 岁月 设计师: pinMode 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值