编程中的会话复制(Weblogic& Java)

时间:2011-02-04 04:39:36

标签: java session java-ee weblogic replication

我想知道是否还需要调用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,是否有任何问题?

提前感谢。

2 个答案:

答案 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