You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by bu...@apache.org on 2003/05/06 18:41:00 UTC

DO NOT REPLY [Bug 19701] New: - array of custom class cannot be serialized in session persistance

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=19701>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=19701

array of custom class cannot be serialized in session persistance

           Summary: array of custom class cannot be serialized in session
                    persistance
           Product: Tomcat 4
           Version: 4.1.24
          Platform: PC
        OS/Version: Solaris
            Status: NEW
          Severity: Major
          Priority: Other
         Component: Catalina
        AssignedTo: tomcat-dev@jakarta.apache.org
        ReportedBy: ccheshire@bigredwire.com


OS : Sun Solaris 2.8 (Intel)
java version "1.4.1"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1-b21)
Java HotSpot(TM) Client VM (build 1.4.1-b21, mixed mode)
Tomcat 4.1.24 w/ Apache 2.0.45

When reloading a context with the manager app, serializing the session fails if
there is an array of a class I have created in the session object. Serialization
of a single instance of the class succeeds. There is one instance where the
serialization of the array succeeds, and that is if the class is in a package
that is read from $TOMCAT_BASE/common/lib.

This is not an ongoing option for me due to file system privileges. If I place
the package in either WEB-INF/lib (as a jar) or expanded into WEB-INF/classes I
get the exception listed below. 

Another observation, a String[] can be serialized successfully.

There is no problem with the class being found for compiling a jsp or servlet,
it is only the classloader used for session persistence that has a problem.

The exception produced (twice) is :

2003-05-05 10:48:12 StandardManager[] ClassNotFoundException while loading
persisted sessions: java.lang.ClassNotFoundExcept
ion: [Lextras.SearchResult;
java.lang.ClassNotFoundException: [Lextras.SearchResult;
        at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1443)
        at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1289)
        at
org.apache.catalina.util.CustomObjectInputStream.resolveClass(CustomObjectInputStream.java:119)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1513)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1435)
        at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1560)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1271)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
        at
org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1369)
        at
org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:864)
        at
org.apache.catalina.session.StandardManager.load(StandardManager.java:440)
        at
org.apache.catalina.session.StandardManager.start(StandardManager.java:655)
        at
org.apache.catalina.core.StandardContext.reload(StandardContext.java:2572)
        at
org.apache.catalina.servlets.ManagerServlet.reload(ManagerServlet.java:802)
        at
org.apache.catalina.servlets.HTMLManagerServlet.reload(HTMLManagerServlet.java:501)
        at
org.apache.catalina.servlets.HTMLManagerServlet.doGet(HTMLManagerServlet.java:151)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
        at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:551)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
        at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
        at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
        at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
        at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
        at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:261)
        at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:360)
        at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:604)
        at
org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:562)
        at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:679)
        at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:619)


The class that produced this error is shown below. Any of my classes fail to be
serialized when in arrays, but succeed when serialized as single objects.

SearchResult.java
******************
package extras;

import java.io.Serializable;
import com.bigredwire.util.Utility;

public class SearchResult implements Serializable, Cloneable {
    
    private String memberId;
    
    private String firstName;
    
    private String lastName;
    
    private String emailAddress;
    
    /** 
     * Creates a new instance of SearchResult 
     */
    public SearchResult() {
        memberId = "";
        firstName = "";
        lastName = "";
        emailAddress = "";
    }

    public String getMemberId() {
        return memberId;
    }
    
    public String getEmailAddress() {
        return emailAddress;
    }
    
    public String getFirstName() {
        return firstName;
    }
    
    public String getLastName() {
        return lastName;
    }
    
    public void setMemberId(String memberId) {
        this.memberId = Utility.ensureLength(memberId, 20, false);
    }
    
    public void setEmailAddress(String emailAddress) {
        this.emailAddress = Utility.ensureLength(emailAddress, 60, false);
    }
    
    public void setFirstName(String firstName) {
        this.firstName = Utility.ensureLength(firstName, 50, false);
    }
    
    public void setLastName(String lastName) {
        this.lastName = Utility.ensureLength(lastName, 50, false);
    }
    
    public Object clone() {
        try {
            return super.clone();
        }
        catch (CloneNotSupportedException ex) {
            throw new InternalError(ex.getMessage());
        }
    }
    
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append("member id = " + memberId);
        sb.append(Utility.EOL);
        sb.append("first name = " + firstName);
        sb.append(Utility.EOL);
        sb.append("last name = " + lastName);
        sb.append(Utility.EOL);
        sb.append("email address = " + emailAddress);
        sb.append(Utility.EOL);
        return sb.toString();
    }
}

---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org