【问题标题】:java.io.NotSerializableException and implementing Serializablejava.io.NotSerializableException 和实现 Serializable
【发布时间】:2011-11-07 23:01:23
【问题描述】:

我的代码遇到了这个异常,我不太确定如何修复它。我正在使用 Apache Tomcat v6.0。我认为“TransactionStorage”类需要实现Serializable,但我该如何去做呢?

"WARNING: Cannot serialize session attribute sortedList for session 4A5378C83A44BC037B0F1985EAC8DD31
java.io.NotSerializableException: com.middleware.hts.TransactionStorage
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
    at java.util.ArrayList.writeObject(ArrayList.java:569)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:592)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:917)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1339)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1290)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1079)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
    at org.apache.catalina.session.StandardSession.writeObject(StandardSession.java:1572)
    at org.apache.catalina.session.StandardSession.writeObjectData(StandardSession.java:1015)
    at org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:528)
    at org.apache.catalina.session.StandardManager.unload(StandardManager.java:469)
    at org.apache.catalina.session.StandardManager.stop(StandardManager.java:678)
    at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4882)
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3454)
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:426)
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1361)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1653)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1662)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1662)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1642)
    at java.lang.Thread.run(Thread.java:595)

TransactionStorage 类目前如下所示:

public class TransactionStorage implements Comparable<TransactionStorage>{

    private List<HubTransaction> success = new ArrayList<HubTransaction>();

    private List<HubTransaction> failure = new ArrayList<HubTransaction>();

    private List<HubTransaction> undetermine = new ArrayList<HubTransaction>();
    private String process;
    private String client;

    public TransactionStorage(String process, String client){
        this.process = new String(process);
        this.client = new String(client);
    }

    public String getProcess(){
        return this.process;
    }

    public String getClient(){
        return this.client;
    }

    public List<HubTransaction> getSuccess(){
        return this.success;
    }

    public List<HubTransaction> getFailure(){
        return this.failure;
    }

    public List<HubTransaction> getUndetermine(){
        return this.undetermine;
    }

    public void addSuccess(HubTransaction ht){
        this.success.add(ht);
    }

    public void addFailure(HubTransaction ht){
        this.failure.add(ht);
    }

    public void addUndetermine(HubTransaction ht){
        this.undetermine.add(ht);
    }

    public int totalTrans(){
        return this.success.size() + this.failure.size() + this.undetermine.size();
    }

    public int compareTo(TransactionStorage arg) {
        double thisRatio = (double)this.success.size() / (double)this.totalTrans();
        double argRatio = (double)arg.getSuccess().size() / (double)arg.totalTrans();
        if(thisRatio < argRatio){
            return 1;
        }else if(thisRatio > argRatio){
            return -1;
        }else{
            return 0;           
        }
    }

}

【问题讨论】:

  • 实现 Comparable,Serializable ?
  • HubTransaction 是否可序列化?
  • @r0ast3d 在这种情况下我将如何实现 Serializable?
  • @ratchetfreak 不,'HubTransaction' 不可序列化
  • @user906153 请看下面BalusC给出的例子

标签: java jsp exception serialization


【解决方案1】:
java.io.NotSerializableException: com.middleware.hts.TransactionStorage

你需要改变

public class TransactionStorage implements Comparable<TransactionStorage>{

public class TransactionStorage implements Comparable<TransactionStorage>, Serializable {

其中Serializablejava.io.Serializable

【讨论】:

    【解决方案2】:

    除非您有权更改该课程,否则您肯定无法做到这一点。如果你这样做,那就太好了。如果不这样做,则必须编写一个适当地覆盖以下方法的包装类。

     private void writeObject(java.io.ObjectOutputStream out) throws IOException
     private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2011-05-31
      • 1970-01-01
      • 2018-04-29
      • 2012-06-17
      相关资源
      最近更新 更多