1 Reply Latest reply on Jun 30, 2010 3:13 PM by alrubinger

    ShrinkWrapStandardContext and Serializable

    alrubinger

      https://jira.jboss.org/browse/SHRINKWRAP-198

       

      Regarding the new Tomcat/ShrinkWrap deployment mechanism:

       

      StandardContext, the parent class of our extension, implements Serializable.  Therefore, our ShrinkWrapStandardContext implicitly does, too.  A few issues:

       

      1. We've got no explicit serialVersionUID
      2. We've got no explicit serialization protocol (either implement Externalizable or put in private readObject/writeObject methods)
      3. The instance member "archive" is not itself Serializable

       

      Recommend implementing 1) as "1L", and accomplishing 2) and 3) in one swipe by taking advantage of the archive.as(SerializableView.class) and writing that.  Then you can reconstitute it back into an Archive during deserialization.

       

      Bonus points for determining if we need to put tests in place which guard wire compatibility across version changes, future-proofing us.  I'm not sure if it's a requirement that we serialize  ShrinkWrapStandardContext between different versions of ShrinkWrap in the future,  If so, we'll need those, too.

       

      S,

      ALR

       

      PS - Shame on Tomcat for making us 1) Subclass their thingy instead of implement some interface and 2) Implement Serializable in the first place

        • 1. Re: ShrinkWrapStandardContext and Serializable
          alrubinger

          Of course, we could be up a creek on this one.  A simple test:

           

          /**
              * Ensures we can serialize/deserialize roundtrip 
              */
             @Test
             public void serializeAndDeserialize() throws Exception
             {
                // Make a context
                final ShrinkWrapStandardContext context = new ShrinkWrapStandardContext(ShrinkWrap.create(JavaArchive.class,
                      "archive.jar").addClass(SerializationUnitTestCase.class));
          
                // Serialize
                final ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
                final ObjectOutputStream out = new ObjectOutputStream(byteOut);
                out.writeObject(context);
                out.flush();
                out.close();
                final ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(byteOut.toByteArray()));
                final ShrinkWrapStandardContext roundtrip = (ShrinkWrapStandardContext) in.readObject();
                in.close();
          
             }
          

           

          ...yields that we now have a problem we might not be able to control:

           

          java.io.NotSerializableException: org.apache.catalina.util.LifecycleSupport
          at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
          at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
          at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
          at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
          at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
          at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
          at org.jboss.shrinkwrap.tomcat.test.SerializationUnitTestCase.serializeAndDeserialize(SerializationUnitTestCase.java:66)
          

           

          S,

          ALR