[英]Java: what happens when an already loaded class is deserialized
假設類com.Foo
是從JAR加載的,后來是一個名為com.Foo
的類,但不同的定義(其他字段)被反序列化(例如從DB加載,或從遠程調用接收)。
可能是什么后果? 新收到的課程會有什么影響嗎? 假設該類在應用程序的其他部分中使用,后續保存在DB和序列化/ JSON編碼中。
你對Serialization
工作方式有錯誤的想象。 您可以像對待其他對象一樣將Class
實例寫入對象流,但這不會將該類的字節代碼及其定義寫入流。 它只是創建一個類的符號引用,它像流的任何其他類引用一樣被解析:通過使用其符號名稱嘗試在反序列化它的類的上下文中解析它。 它不會創建新類。
實際上, java.lang.Class
的實例創建的實際類依賴性比創建它的實例少。 實例取決於序列化形式,例如類的非transient
字段,而由java.lang.Class
實例表示的符號引用不依賴於它。
編寫流時出現的類與反序列化時出現的類之間的兼容性由serialVersionUID
確定(如果不匹配),反序列化將始終失敗並出現異常。 如果匹配,則實施將盡力恢復。 流中不存在的字段獲取其默認值,實際類中不存在的流字段以及任何其他未處理的額外數據將被忽略。
如果反序列化Class<?>
對象,則會加載具有完全限定類名的類。 如果已經加載,您將獲得該類的引用。
我認為,要獲得完整的答案,您應該閱讀Java Object Serialization Specification
以下是我認為非常有用的規范中的一些引用:
1.1概述
數組,枚舉常量以及Class,ObjectStreamClass和String類型的對象需要特殊處理。 其他對象必須實現Serializable或Externalizable接口才能保存在流中或從流中恢復。
2.對象輸出類
如果對象是Class,則將相應的ObjectStreamClass寫入流,為該類分配句柄,並返回writeObject。
3.對象輸入類
如果流中的對象是Class,則讀取其ObjectStreamClass描述符,將其及其句柄添加到已知對象集中,並返回相應的Class對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.