我想知道是否还需要调用session.setAttribute或session.getAttribute的对象来实现“java.io.Serializable”以支持会话复制?
例如,User类实现了Serializable接口。 但是如果需要调用“session.setAttribute”的类SomeUtilityClass来实现Serializable接口。
/* Does it also need to implement the Serializable here? */
public class SomeUtilityClass{
public void test(HttpServletRequest request){
request.getSession().setAttribute("user", new User());
}
}
public class User implements Serializable{
private static final long serialVersionUID = 12345432534456654664L;
//skip the getter & setter...
}
如果会话复制中省略了变量serialVersionUID,是否有任何问题?
提前感谢。
答案 0 :(得分:2)
只有进入会话的对象才需要可序列化(即实现Serializable
接口)
这意味着任何被设置为属性的对象,以及这些对象中包含的任何对象。
所以,如果你有一个班级
public class User implements Serializable {
private Department department;
// ...
}
然后您的Department
课程也需要实施Serializable
简单地对会话进行调用的类(包括对setAttribute
的调用)不需要实现Serializable
(包括SomeUtilityClass
)
原因是会话中的任何内容都必须发送到其他WebLogic节点(可能在不同的服务器上运行)。这意味着它需要通过网络发送您的User
类,因此它需要能够将您的User
类转换为可以发送的一系列字节,然后将其转换回另一方面又是一个真实的物体。
当你实现Serializable
接口时,你告诉Java你已经构建了你的类,它可以将它转换成那些字节,(然后再返回)。如果你没有实现Serializable
,那么Java不知道是否可以这样做,所以它不会。
注意:不会发送类的代码,只是其中的字段值。代码已经在另一个节点上,因为它已经部署到已经部署到所有节点的应用程序中。
您的实用程序类,不需要通过网络。您还没有将该类的对象放入会话中,因此WebLogic不需要将其作为会话复制的一部分转换为字节(并且再次返回_)。
唯一需要Serializable
的内容是进入会话的对象 直接(例如User
)或间接(如Department
示例)
简单地在会话上进行调用的对象不需要是Serializable
。
答案 1 :(得分:0)
如果您的实用程序类没有跨服务器实例复制的状态,则不需要将其序列化。至于serialVersionUID,它本身就是whole个新discussion。