[英]How are calls to static members of another class handled in Java Object Serialization?
public class Employee implements java.io.Serializable
{
public String name = "Tom";
public void mailCheck()
{
String address = SomeClass.ItsStaticField(name); //call to static
System.out.println("Mailing a check to " + name
+ " " + address);
}
}
public class SomeClass()
{
// Static Map of <Name, Address>
private static Map<String, String> NameAddressMap= new HashMap<String, String>();
string address;
Static ItsStaticField(name)
{
if (NameAddressMap.containsKey(name){
address = NameAddressMap.get(name);
}
else{
// address =...make a webservice call ... get address for name
NameAddressMap.put(name, address);
}
return address;
}
}
序列化上述對象時會發生什么? 並在分布式環境中的另一個節點上反序列化? 什么時候調用“ SomeClass.ItsStaticField()”? 是否在序列化之前計算“地址”字段的值,然后將其捆綁成字節,作為序列化過程的一部分?
更新:為自由添加更多信息表示歉意。 添加了“ SomeClass”的示例代碼。 我在分布式環境(尤其是Hadoop)中擁有上述代碼。 我知道這是一件壞事,因為將有多個Web服務調用,並且預期的“緩存機制”實際上並沒有按預期工作。 我想了解的是,何時以及多少次調用Web服務調用? 在所有節點上以及何時創建靜態映射“ NameAddressMap”的實例有多少? 非常感謝!
序列化上述對象時會發生什么?
name
已序列化
並在分布式環境中的另一個節點上反序列化?
name
反序列化
什么時候調用“ SomeClass.ItsStaticField()”?
調用mailCheck();
是否在序列化之前計算“地址”字段的值,然后將其捆綁成字節,作為序列化過程的一部分?
不,它不是序列化對象的成員。
序列化序列化對象字段,而不是其方法。 方法的內容保留在類定義中,而不是在實例本身中。
序列化一個類時,反序列化該節點的節點需要反序列化所需的所有.class文件。 在您的情況下,類SomeClass
是Employee
依賴項的一部分。 因此,為了反序列化Employee,在本地節點上既需要Employee.class也需要SomeClass.class。
注意:由於Java是動態編譯的,因此它應一直起作用,直到您實際嘗試調用mailCheck
方法mailCheck
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.