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 編譯器會自動生成一個。