You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2012/02/29 15:39:01 UTC

svn commit: r1295134 - in /commons/proper/lang/trunk/src: main/java/org/apache/commons/lang3/SerializationUtils.java site/changes/changes.xml test/java/org/apache/commons/lang3/SerializationUtilsTest.java

Author: ggregory
Date: Wed Feb 29 14:39:01 2012
New Revision: 1295134

URL: http://svn.apache.org/viewvc?rev=1295134&view=rev
Log:
[LANG-788] SerializationUtils throws ClassNotFoundException when cloning primitive classes

Modified:
    commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/SerializationUtils.java
    commons/proper/lang/trunk/src/site/changes/changes.xml
    commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/SerializationUtilsTest.java

Modified: commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/SerializationUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/SerializationUtils.java?rev=1295134&r1=1295133&r2=1295134&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/SerializationUtils.java (original)
+++ commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/SerializationUtils.java Wed Feb 29 14:39:01 2012
@@ -25,6 +25,8 @@ import java.io.ObjectOutputStream;
 import java.io.ObjectStreamClass;
 import java.io.OutputStream;
 import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * <p>Assists with the serialization process and performs additional functionality based
@@ -234,8 +236,10 @@ public class SerializationUtils {
      * class here is a workaround, see the JIRA issue LANG-626. </p>
      */
      static class ClassLoaderAwareObjectInputStream extends ObjectInputStream {
+        private static final Map<String, Class<?>> primitiveTypes = 
+                new HashMap<String, Class<?>>();
         private ClassLoader classLoader;
-
+        
         /**
          * Constructor.
          * @param in The <code>InputStream</code>.
@@ -246,6 +250,16 @@ public class SerializationUtils {
         public ClassLoaderAwareObjectInputStream(InputStream in, ClassLoader classLoader) throws IOException {
             super(in);
             this.classLoader = classLoader;
+
+            primitiveTypes.put("byte", byte.class);
+            primitiveTypes.put("short", short.class);
+            primitiveTypes.put("int", int.class);
+            primitiveTypes.put("long", long.class);
+            primitiveTypes.put("float", float.class);
+            primitiveTypes.put("double", double.class);
+            primitiveTypes.put("boolean", boolean.class);
+            primitiveTypes.put("char", char.class);
+            primitiveTypes.put("void", void.class);
         }
 
         /**
@@ -262,7 +276,15 @@ public class SerializationUtils {
             try {
                 return Class.forName(name, false, classLoader);
             } catch (ClassNotFoundException ex) {
-                return Class.forName(name, false, Thread.currentThread().getContextClassLoader());
+                try {
+                    return Class.forName(name, false, Thread.currentThread().getContextClassLoader());
+                } catch (ClassNotFoundException cnfe) {
+                    Class<?> cls = primitiveTypes.get(name);
+                    if (cls != null)
+                        return cls;
+                    else
+                        throw cnfe;
+                }
             }
         }
 

Modified: commons/proper/lang/trunk/src/site/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/site/changes/changes.xml?rev=1295134&r1=1295133&r2=1295134&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/site/changes/changes.xml (original)
+++ commons/proper/lang/trunk/src/site/changes/changes.xml Wed Feb 29 14:39:01 2012
@@ -22,6 +22,7 @@
   <body>
 
   <release version="3.2" date="TBA" description="Next release">
+    <action type="fix" issue="LANG-788">SerializationUtils throws ClassNotFoundException when cloning primitive classes</action>
     <action type="fix" issue="LANG-786">StringUtils equals() relies on undefined behavior</action>
     <action type="fix" issue="LANG-783">Documentation bug: StringUtils.split</action>
     <action type="fix" issue="LANG-776">TypeUtilsTest contains incorrect type assignability assertion</action>

Modified: commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/SerializationUtilsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/SerializationUtilsTest.java?rev=1295134&r1=1295133&r2=1295134&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/SerializationUtilsTest.java (original)
+++ commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/SerializationUtilsTest.java Wed Feb 29 14:39:01 2012
@@ -364,6 +364,16 @@ public class SerializationUtilsTest exte
         }
         fail();
     }
+    
+    public void testPrimitiveTypeClassSerialization() {
+        Class<?>[] primitiveTypes = { byte.class, short.class, int.class, long.class, float.class, double.class,
+                boolean.class, char.class, void.class };
+
+        for (Class<?> primitiveType : primitiveTypes) {
+            Class<?> clone = SerializationUtils.clone(primitiveType);
+            assertEquals(primitiveType, clone);
+        }
+    }
 
 }