Uploaded image for project: 'JBoss Serialization'
  1. JBoss Serialization
  2. JBSER-128

Unable to deserialize Vector and other objects when using JDK 7

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Resolved (View Workflow)
    • Priority: Major
    • Resolution: Done
    • Affects Version/s: 1.0.5.FINAL
    • Fix Version/s: 1.1.0 Beta, 1.0.6.FINAL
    • Labels:
      None
    • Environment:

      JBoss EAP 5.2 on JDK 7

      Description

      JDK 7 changed the writeObject of Vector,

      ObjectOutputStreamProxy.writeFields is being called, which write the fields out not as a FinalContainer , writeMyself checks the type and for non FinalContainer it just writes the object in metho FieldsContainer.writeField as:

      out.writeByte(DataContainerConstants.OBJECTREF);
      out.writeObject(value);

      When reading, RegularObjectPersister is expecting all FinalContainer.

      So it looks like either FinalContainer.writeField may need to wrap the objects in a FinalContainer or on the reading side it needs to read the non wrapped fields before reading the wrapped fields.

      public void writeFields() throws IOException {
      if (currentContainer!=null)

      { currentContainer.writeMyself(this); currentContainer=null; }

      JDK 6
      --------------------------------------------------------------------------
      public class Vector<E>
      extends AbstractList<E>

      private synchronized void writeObject(java.io.ObjectOutputStream s)
      throws java.io.IOException

      { s.defaultWriteObject(); }

      JDK 7
      --------------------------------------------------------------------------
      private void writeObject(java.io.ObjectOutputStream s)
      throws java.io.IOException {
      final java.io.ObjectOutputStream.PutField fields = s.putFields();
      final Object[] data;
      synchronized (this)

      { fields.put("capacityIncrement", capacityIncrement); fields.put("elementCount", elementCount); data = elementData.clone(); }

      fields.put("elementData", data);
      s.writeFields();
      }

      org.jboss.serial.exception.SerializationException: Excepted to be int
      at org.jboss.serial.objectmetamodel.DataContainer$DataContainerInput.readInt(DataContainer.java:1050)
      at org.jboss.serial.persister.RegularObjectPersister.readSlotWithFields(RegularObjectPersister.java:333)
      at org.jboss.serial.persister.RegularObjectPersister.defaultRead(RegularObjectPersister.java:290)
      at org.jboss.serial.persister.RegularObjectPersister.readData(RegularObjectPersister.java:258)
      at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:412)
      at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:82)
      at org.jboss.serial.objectmetamodel.DataContainer$DataContainerInput.readObject(DataContainer.java:847)
      at test.Serial.main(Serial.java:28)
      Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to org.jboss.serial.finalcontainers.IntegerContainer
      at org.jboss.serial.objectmetamodel.DataContainer$DataContainerInput.readInt(DataContainer.java:1046)
      ... 7 more
      java.io.EOFException
      at java.io.DataInputStream.readFully(DataInputStream.java:197)
      at org.jboss.serial.util.StringUtil.pullDataToBuffer(StringUtil.java:191)
      at org.jboss.serial.util.StringUtil.readString(StringUtil.java:238)
      at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readUTF(DataContainer.java:757)
      at org.jboss.serial.persister.RegularObjectPersister.readSlotWithFields(RegularObjectPersister.java:322)
      at org.jboss.serial.persister.RegularObjectPersister.defaultRead(RegularObjectPersister.java:290)
      at org.jboss.serial.persister.RegularObjectPersister.readData(RegularObjectPersister.java:258)
      at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:412)
      at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:82)
      at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:643)
      at org.jboss.serial.io.JBossObjectInputStream.readObjectOverride(JBossObjectInputStream.java:163)
      at java.io.ObjectInputStream.readObject(ObjectInputStream.java:363)
      at test.Serial.main(Serial.java:48)

        Gliffy Diagrams

          Attachments

            Issue Links

              Activity

                People

                • Assignee:
                  bmaxwell Brad Maxwell
                  Reporter:
                  bmaxwell Brad Maxwell
                • Votes:
                  1 Vote for this issue
                  Watchers:
                  6 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved: