Thaddeus Diamond created IO-368:
-----------------------------------

             Summary: ClassLoaderObjectInputStream does not handle primitive 
typed members
                 Key: IO-368
                 URL: https://issues.apache.org/jira/browse/IO-368
             Project: Commons IO
          Issue Type: Bug
          Components: Streams/Writers
    Affects Versions: 2.0.1
         Environment: Single node computer, running standard JVM (Oracle 1.6.0)
            Reporter: Thaddeus Diamond


Any class with a simple primitive (such as long, or int) cannot be 
deserialized.  For example, the following code:

{code:java}
    ObjectInputStream ois = null;
    try {
      ois = new ClassLoaderObjectInputStream(getClass().getClassLoader(), new 
ByteArrayInputStream(bytes));
      return (T) ois.readObject();
    } catch (ClassNotFoundException e) {
      LOGGER.error("Deserialization failed for {}", objectClass, e);
    } catch (IOException e) {
      LOGGER.error("Deserialization failed for {}", objectClass, e);
    } finally {
      if (ois != null) {
        try {
          ois.close();
        } catch (IOException ignored) {
        }
      }
    }
{code}

Will fail if bytes represents a byte[] of the serialized version of the 
following class:

{code:java}
public class Foo {

  private static final long serialVersionUID = 1L;

  private long thisFieldWillCauseCLOISToFail;

  // class logic, ctors, etc...

}
{code}

With the following stacktrace:

{noformat}
Caused by: java.lang.ClassNotFoundException: long
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at 
org.apache.commons.io.input.ClassLoaderObjectInputStream.resolveClass(ClassLoaderObjectInputStream.java:68)
        at 
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1574)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
        at java.io.ObjectInputStream.readClass(ObjectInputStream.java:1461)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1311)
        at 
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
        at 
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
        at 
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
        at 
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
        at 
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
        at 
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
        at 
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
        at 
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
        at java.util.ArrayList.readObject(ArrayList.java:593)
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at 
java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)
        at 
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
        at 
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
...
{noformat}

Of some relevance may be:
http://issues.liferay.com/browse/LPS-30742
https://groups.google.com/forum/?hl=en&fromgroups=#!topic/akka-user/3PC4L48qyqs

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to