我想知道调用session.setAttribute或session.getAttribute的对象是否也需要实现“java.io.Serialized”以支持 session 复制?
例如
User 类实现了 Serialized 接口(interface)。
但如果调用“session.setAttribute”的类SomeUtilityClass需要实现Serialized接口(interface)。
/* 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...
}
如果 session 复制中省略了变量serialVersionUID,是否会出现任何问题?
提前致谢。
最佳答案
只有进入 session 的对象才需要可序列化(即实现 Serialized
接口(interface))
这意味着设置为属性的任何对象,以及这些对象中包含的任何对象。
如果你有课
public class User implements Serializable {
private Department department;
// ...
}
那么你的Department
类也需要实现Serialized
简单地在 session 上进行调用的类(包括对 setAttribute
的调用)不需要实现 Serialized
(包括 SomeUtilityClass
)
原因是 session 中的任何内容都必须发送到其他 WebLogic 节点(可能在不同的服务器上运行)。这意味着它需要通过网络发送您的 User
类,因此它需要能够将您的 User
类转换为一系列可以发送的字节,然后在另一面再次将其变回真实物体。
当你实现Serialized
接口(interface)时,你就是在告诉Java你已经以一种可以将类转入这些字节(然后再转回来)的方式构建了你的类。如果你没有实现Serialized
,那么Java不知道是否可以这样做,所以它不会这样做。
注意:类的代码不会被发送,只是发送其中字段的值。该代码已经在另一个节点上,因为它是已经部署到所有节点的应用程序的一部分。
您的实用程序类不需要通过网络。您还没有将该类的对象放入 session 中,因此 WebLogic 不需要将其转换为字节(然后再返回_)作为 session 复制的一部分。
唯一需要可序列化
的是直接放入 session 的对象(例如您的User
)或间接(如部门
示例)。
仅在 session 上进行调用的对象不需要可序列化
。
关于java - 编程中的 session 复制(Weblogic 和 Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4894630/