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”实例?非常感谢!
答案 0 :(得分:4)
当上述对象被序列化时会发生什么?
name
已序列化
在分布式环境中的另一个节点上反序列化?
name
已反序列化
什么时候&#39; SomeClass.ItsStaticField()&#39;调用?
致电mailCheck();
地址是&#39;字段值在序列化之前计算,然后作为序列化过程的一部分捆绑成字节?
不,它不是序列化对象的成员。
答案 1 :(得分:1)
序列化序列化对象字段,而不是其方法。方法的内容保留在类定义中,而不是实例本身。
答案 2 :(得分:1)
当一个类被序列化时,反序列化它的节点需要反序列化所需的所有.class文件。在您的情况下,类SomeClass
是Employee
的依赖项的一部分。因此,为了反序列化Employee,本地节点上需要Employee.class和SomeClass.class。
注意:由于Java是动态编译的,因此它应该有效,直到您真正尝试调用mailCheck
方法。