setattribute:不可序列化属性(java对象序列化)

fdx2calv  于 2021-07-05  发布在  Java
关注(0)|答案(4)|浏览(655)

我们刚换成了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。此方法调用ibatisMap。

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());
}
vx6bjr1n

vx6bjr1n1#

通过使用可序列化列表实现并确保列表中的对象也可序列化,可以使对象可序列化。
是的——最好只在会话中放置可序列化对象,因为这样可以使应用程序在具有多个节点的服务器上运行。即使你现在不关心这个问题,将来也可能有用。
servlet容器应该确保会话不会在用户之间交换。使会话中存储的对象可序列化允许容器跨集群中的多个节点“分发”会话状态,从而允许拥有会话的用户拥有由任何节点提供服务的请求。

qlfbtfca

qlfbtfca2#

列表包含什么类型的对象?i、 清单的一般类型是什么?是list还是list其中question是一个自制的javabean类?如果是后者,则需要让它实现java.io.serializable。基本上就这些。javabean规范也要求您这样做。

lmyy7pcs

lmyy7pcs3#

它要求它们是可序列化的,因为servlet规范规定,如果“distributable”标记在web.xml中,它们就必须是可序列化的。该规范假设servlet引擎将使用序列化跨服务复制会话。
使其可序列化的唯一方法是。。。使用可序列化的列表实现!您必须已经编写了自己的自定义列表类,因为据我所知,jdk中的所有实现都是可序列化的。或者列表中的对象不可序列化。
或者,如果您不关心会话是否跨多个服务器复制,您也可以删除“可分发的”。

wfauudbj

wfauudbj4#

如果所有jdk集合的元素都是可序列化的,那么它们都是可序列化的。我猜是列表元素不可序列化,而不是列表对象本身。要(过度)简化,要使对象可序列化,它必须:
实现可序列化
只有可序列化的非静态非 transient 字段

相关问题