簡體   English   中英

如何在Java對象序列化中處理對另一個類的靜態成員的調用?

[英]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文件。 在您的情況下,類SomeClassEmployee依賴項的一部分。 因此,為了反序列化Employee,在本地節點上既需要Employee.class也需要SomeClass.class。

注意:由於Java是動態編譯的,因此它應一直起作用,直到您實際嘗試調用mailCheck方法mailCheck

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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