setAttribute:非可序列化属性(Java对象序列化)

时间:2009-11-02 16:40:08

标签: java serialization glassfish

我们刚刚切换到Glassfish V2。我们现在在设置会话属性时遇到错误。

错误是:

java.lang.IllegalArgumentException: PWC2788: setAttribute: Non-serializable attribute

代码是:

getRequest().getSession().setAttribute("questionsForUser", getQuestions());

getQuestions()只是一个简单的getter,它位于一个名为“Parent Action”的抽象类中....所以要使getQuestions()成为一个序列化对象,我的类需要实现可序列化吗?:

public List getQuestions() {
    return questions;
}
  • 我们如何制作这个对象 序列化?
  • 只是放一个好习惯 会话中的序列化对象(如 Glassfish似乎需要)?
  • 是否存在会话风险 在序列化的用户之间交换 对象?

编辑:我正在使用ORM(iBatis)

有关“问题”的更多信息

设定器:

public void setQuestions(List questions) {
    this.questions = questions;
}

在此方法中调用setter。此方法调用iBatis映射。

public void prepareQuestions()
{        
setExamIfaceDAO((SecurityExamIfaceDAO)ApplicationInitializer.getApplicationContext().getBean("securityExamIfaceDAO"));
    String userRole = questionsBasedOnUserRole();
    int questionsToBeShown = 0;
    if (userRole.equalsIgnoreCase("C"))
        questionsToBeShown = 15;
    else if (userRole.equalsIgnoreCase("U"))
        questionsToBeShown = 10;
    List local_questions = getExamIfaceDAO().getSecurityQuestions(userRole);
    Collections.shuffle(local_questions);
    if (local_questions.size()>=questionsToBeShown)
        setQuestions(local_questions.subList(0, questionsToBeShown));
    getRequest().getSession().setAttribute("questionsForUser", getQuestions());
}

4 个答案:

答案 0 :(得分:10)

您可以使用可序列化的List实现使对象可序列化,并确保列表中的对象也可序列化。

是的 - 最好只在会话中放置可序列化的对象,因为这样可以让您的应用程序在具有多个节点的服务器上运行。即使您现在不关心这一点,它在将来可能会有用。

servlet容器应确保不在用户之间交换会话。使存储在会话中的对象可序列化允许容器在群集中的多个节点之间“分配”会话状态,从而允许拥有会话的用户具有由任何节点服务的请求。

答案 1 :(得分:3)

要求它们是可序列化的,因为servlet规范说如果“distributable”标记在web.xml中则必须是这样。该规范假定servlet引擎将使用序列化跨服务复制会话。

使其可序列化的唯一方法是......使用可序列化的List实现!您必须编写自己的自定义List类,因为JDK中的所有实现都是可序列化的,我知道。列表中的对象或列表中的对象都不可序列化。

如果您不关心会话是否在多个服务器之间复制,您可以删除“distributable”。

答案 2 :(得分:0)

List包含哪些类型的对象?即什么是列表的通用类型?它是List< String>或列表<问题>其中问题是本土的javabean类?如果是后者,则需要让它实现java.io.Serializable。这基本上都是。 javabean规范也要求你这样做。

答案 3 :(得分:0)

所有JDK集合都是可序列化的,如果它们的元素是可序列化的。我的猜测是List 元素不可序列化,而不是List对象本身。为了(过度)简化,对于可序列化的对象,它必须:

  • 实施Serializable
  • 仅具有可序列化的非静态非瞬态字段