Wicket:如何摆脱WicketNotSerializableException?

时间:2013-05-31 10:31:46

标签: serialization wicket

好的,这里是页面的代码

public class ViewDocument extends BasePage{

    private List<WeinSyncFileContent> transactions;
    ....

    public ViewDocument(){
        transactions = ....;
        ....
        listContainer.add(listView = new ListView<WeinSyncFileContent>("transactions", transactions){
           @Override
           public void populateItem(final ListItem<WeinSyncFileContent> item)
           {
              ....
           }
        });
    }
}

页面确实显示但我收到错误:     序列化对象类kz.wein.wicket.pages.documents.ViewDocument

时出错

并且它抱怨交易字段:     transactions [class = java.util.ArrayList $ SubList]&lt; -----不可序列化的字段

另外我想要注意的是,我在列表中显示的对象最初是从库中获取的,不可序列化。 Wicket希望列表中的可序列化对象,以便处理它我采用每个对象并使其可以像这样使用类进行序列化

public class WeinSyncFileContent extends SyncFileContent implements Serializable{

public WeinSyncFileContent(SyncFileContent obj){
    ... setting fields ...

}

}

所以最初我得到了SyncFileContent对象(不可序列化) 我该怎么办?

1 个答案:

答案 0 :(得分:4)

您收到此错误,因为Wicket页面中的任何字段级变量都将被序列化。因此,没有任何非可序列化的对象作为字段级变量可能是个好主意。您的WeinSyncFileContent中必须有一个不可序列化的对象,这就是您收到此错误的原因。

您可能希望使用模型来加载列表,例如:

public ViewDocument(){

    ...

    listContainer.add(new ListView<WeinSyncFileContent>(
        "transactions", 
        new LoadableDetachableModel<List<WeinSyncFileContent>>() {
            protected List<WeinSyncFileContent> load() {
                return ...;
            }
        })
    {
       @Override
       public void populateItem(final ListItem<WeinSyncFileContent> item)
       {
          ....
       }
    });
}