如何在Java对象序列化中处理对另一个类的静态成员的调用?

时间:2014-09-11 21:37:24

标签: java serialization jvm static-members distributed-system

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”实例?非常感谢!

3 个答案:

答案 0 :(得分:4)

  

当上述对象被序列化时会发生什么?

name已序列化

  

在分布式环境中的另一个节点上反序列化?

name已反序列化

  

什么时候&#39; SomeClass.ItsStaticField()&#39;调用?

致电mailCheck();

  

地址是&#39;字段值在序列化之前计算,然后作为序列化过程的一部分捆绑成字节?

不,它不是序列化对象的成员。

答案 1 :(得分:1)

序列化序列化对象字段,而不是其方法。方法的内容保留在类定义中,而不是实例本身。

答案 2 :(得分:1)

当一个类被序列化时,反序列化它的节点需要反序列化所需的所有.class文件。在您的情况下,类SomeClassEmployee的依赖项的一部分。因此,为了反序列化Employee,本地节点上需要Employee.class和SomeClass.class。

注意:由于Java是动态编译的,因此它应该有效,直到您真正尝试调用mailCheck方法。