Uploaded image for project: 'Harmony'
  1. Harmony
  2. HARMONY-4638

[classlib][luni] ObjectStreamClass.lookup() incorrectly works

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • None
    • None
    • Win XP
    • Moderate

    Description

      ObjectStreamClass.lookup() method returns incorrect ObjectStreamClass, which could not be used for replacement in ObjectInputStream.readClassDescriptor(). The test below demonstrates the problem.
      Output on RI: Passed
      Output on Harmony: FAILED: expected - It's a test, but got - null

      --------- Test.java -----------
      import java.io.*;

      public class Test implements Serializable {
      public String str;

      public static void main(String[] args) throws Exception {
      Test t = new Test();
      t.str = "It's a test";
      PipedOutputStream pout = new PipedOutputStream();
      PipedInputStream pin = new PipedInputStream(pout);
      ObjectOutputStream out = new ObjectOutputStream(pout);
      TestObjectInputStream in = new TestObjectInputStream(pin);
      out.writeObject(t);
      Test t1 = (Test) in.readObject();

      if (!t.str.equals(t1.str))

      { System.out.println("FAILED: expected - " + t.str + ", but got - " + t1.str); }

      else

      { System.out.println("PASSED."); }

      }

      static class TestObjectInputStream extends ObjectInputStream {
      private static ObjectStreamClass testOsc = ObjectStreamClass.lookup(Test.class);

      TestObjectInputStream(InputStream in) throws IOException

      { super(in); }

      protected ObjectStreamClass readClassDescriptor() throws ClassNotFoundException, IOException {
      ObjectStreamClass osc = super.readClassDescriptor();

      if(osc.getName().equals("Test"))

      { return testOsc; }

      return osc;
      }
      }
      }
      -------------------------

      I've investigated the problem a bit and found that ObjectStreamClass has package-protected method getLoadFields() which is used by ObjectInputStream to get an array of ObjectStreaFields-s to be loaded from the stream in case of default de-serialization. For ObjectStreamClass created by ObjectStreamClass.lookup() method, this method returns an empty array, thus in case of default de-serialization ObjectInputStream does not try to read any field value from the stream - although there are data to be read in the stream.

      I'll provide a patch soon.

      Attachments

        1. H-4638.patch
          6 kB
          Mikhail Markov

        Activity

          People

            tellison Tim Ellison
            mmarkov Mikhail Markov
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment