Commons Lang
  1. Commons Lang
  2. LANG-789

SerializationUtils clone method fails to perform some deep cloning

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Not a Problem
    • Affects Version/s: 3.1
    • Fix Version/s: None
    • Component/s: lang.*
    • Environment:

      Windows 7, Java 7 (1.7.0_03), Apache Commons Lang 3.1, NetBeans 7.1

      Description

      SerializationUtils clone method fails to perform some deep cloning of at least some objects containing Externalizable subobjects.

      Here is the @version text from the SerializationUtils.java source file:

      SerializationUtils.java 1199718 2011-11-09 12:43:20Z sebb $

      To reproduce possible bug:

      1. Create two classes (let's call them Parent and Child) and mark both as "implements Externalizable".

      2. Write required Externalizable methods readExternal and writeExternal

      3. Make Child a private member/field of Parent

      4. Write code to override toString if necessary for Parent and Child

      5. Create a separate Java class to test creation and cloning of Parent and Child

      6. In the test class write to code to do this:
      a. Create a Parent object
      b. Create a Child object
      c. Attach Child to Parent via setter
      d. Print out Parent object
      e. Use SerializationUtils.clone() to clone Parent (call it ParentClone)
      f. Print ParentClone

      7. Compare print output of Parent and ParentClone, observe that ParentClone does not contain Child object

        Activity

        Harry Levinson made changes -
        Field Original Value New Value
        Status Open [ 1 ] Closed [ 6 ]
        Resolution Not A Problem [ 8 ]
        Hide
        Harry Levinson added a comment -

        Thanks Marcos, closing this issue now.

        It turned out to be a bug in my code elsewhere, and not the clone "bug" issue I submitted.

        I was able to run a version of your code that ran fine. Also fixed my own code and disabled the clone workaround I developed for the child class, all works fine now.

        Thanks again for looking at this, sorry to waste your time!

        Show
        Harry Levinson added a comment - Thanks Marcos, closing this issue now. It turned out to be a bug in my code elsewhere, and not the clone "bug" issue I submitted. I was able to run a version of your code that ran fine. Also fixed my own code and disabled the clone workaround I developed for the child class, all works fine now. Thanks again for looking at this, sorry to waste your time!
        Hide
        Marcos Vinícius da Silva added a comment -

        I tested this on Windows 7 Sun JDK 1.7.0_03 and Ubuntu 10.04 Sun JDK 1.6.0.26, and worked fine. I used this test case:

            public void testInnerClassImplementsExternalizable() {
                ExternalizableParent parent = new ExternalizableParent("test");
                ExternalizableParent parentClone = SerializationUtils.clone(parent);
                
                assertEquals(parent.toString(), parentClone.toString());
            }
            
            private static final class ExternalizableParent implements Serializable, Externalizable {
                private ExternalizableChild child;
        
                public ExternalizableParent() {}
                
                public ExternalizableParent(String value) {
                    child = new ExternalizableChild(value);
                }
                
                @Override
                public String toString() {
                    return child.value;
                }
        
                public void readExternal(ObjectInput in) throws IOException,
                        ClassNotFoundException {
                    child = (ExternalizableChild)in.readObject();
                }
        
                public void writeExternal(ObjectOutput out) throws IOException {
                    out.writeObject(child);
                }
            }
            
            private static final class ExternalizableChild implements Serializable, Externalizable {
                public String value;
        
                public ExternalizableChild() {}
                
                public ExternalizableChild(String value) {
                    this.value = value;
                }
        
                public void readExternal(ObjectInput in) throws IOException,
                        ClassNotFoundException {
                    value = (String)in.readObject();
                }
        
                public void writeExternal(ObjectOutput out) throws IOException {
                    out.writeObject(value);
                }
            }
        

        Are you doing something different?

        Show
        Marcos Vinícius da Silva added a comment - I tested this on Windows 7 Sun JDK 1.7.0_03 and Ubuntu 10.04 Sun JDK 1.6.0.26, and worked fine. I used this test case: public void testInnerClassImplementsExternalizable() { ExternalizableParent parent = new ExternalizableParent( "test" ); ExternalizableParent parentClone = SerializationUtils.clone(parent); assertEquals(parent.toString(), parentClone.toString()); } private static final class ExternalizableParent implements Serializable, Externalizable { private ExternalizableChild child; public ExternalizableParent() {} public ExternalizableParent( String value) { child = new ExternalizableChild(value); } @Override public String toString() { return child.value; } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { child = (ExternalizableChild)in.readObject(); } public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(child); } } private static final class ExternalizableChild implements Serializable, Externalizable { public String value; public ExternalizableChild() {} public ExternalizableChild( String value) { this .value = value; } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { value = ( String )in.readObject(); } public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(value); } } Are you doing something different?
        Harry Levinson created issue -

          People

          • Assignee:
            Unassigned
            Reporter:
            Harry Levinson
          • Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development