Java.io.NotSerializableException and implementation of Serializable

I am using this exception with my code, and I'm not quite sure how to fix it. I am using Apache Tomcat v6.0. I suppose the TransactionStorage class should implement Serializable, but how do I do this?

"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) 

Currently, the TransactionStorage class is as follows:

 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; } } } 
+4
source share
2 answers
 java.io.NotSerializableException: com.middleware.hts.TransactionStorage 

You need to change

 public class TransactionStorage implements Comparable<TransactionStorage>{ 

to

 public class TransactionStorage implements Comparable<TransactionStorage>, Serializable { 

where is Serializable java.io.Serializable .

+3
source

It looks like you cannot if you do not have access to change this class. If so, excellent. If you do not, you will have to write a wrapper class that overrides the following methods accordingly.

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

Source: https://habr.com/ru/post/1380083/


All Articles