序列化相關面試題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章