簡體   English   中英

Java:當已經加載的類被反序列化時會發生什么

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM