一位同事和我对特定情况存在分歧。
我们有Serializable
个对象,其toString()
方法。这个toString()
是通过调用Apache的ReflectionToStringBuilder
来实现的。像这样:
public class Foo implements Serializable {
// bunch of instance variables, getters and setters ...
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
}
我们无法控制这些对象的传递方式。在我们的特定应用程序中,我们可以通过RMI调用,HTTP POST(在写为JSon字符串之后),通过JMS或其他协议传递它们。
现在,JSon字符串案例应该无关紧要,因为它将以String形式发送,因此toString()
方法的实现细节无关紧要。但是对于(某些)其他协议,我们期望序列化对象本身。
Serializable类中的方法是否可以调用静态方法并且仍然可以(功能上)可序列化?它编译得很好,当然 - 但它仍然可以通过电线发送吗?如果接收服务在其类路径上没有静态方法的类,它是否会无法反序列化?
答案 0 :(得分:1)
是的,这会有效。 Java的内置序列化框架从不调用toString()
,所以它基本上可以做任何想做的事。
大多数情况下,只是逐个字段地复制序列化对象,而不调用任何对象方法。类可以通过实现特殊方法来更改此默认行为(有关详细信息,请参阅http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html),但在您的示例中并非如此。所以无论你的方法是什么(不仅是toString()
),它都与序列化无关。
现在回答第二个问题:如果ReflectionToStringBuilder
不在类路径中会发生什么?这很简单:没有任何反应。只要未使用ReflectionToStringBuilder
(即调用其任何静态方法,或者您正在创建它的实例),该类就不会被加载(或者至少没有链接),所以它不会如果它存在与否则重要。只有当您尝试实际使用该类时,才能获得NoClassDefFoundError
。因此,反序列化对象将起作用,但如果您调用toString()
,则会出现异常。
答案 1 :(得分:1)
您的示例完全可以进行序列化。
理论上,Java对象的JSON表示只是序列化的另一种形式。所有序列化都是为了写对象" state"流入流并能够从流中读取该状态。它不关心对象的操作或它们的实现方式,包括toString方法。 在这种情况下,Java对象的状态由其实例变量表示,并且不包括对象类定义。 当你读回你的Foo时,你已经应该在类路径中使用Foo.class和Apache的ReflectionToStringBuilder.class。