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 编译器会自动生成一个。