[jdom-interest] Fixed - Re: Serialization Trouble through Inheritance

Rolf Lear jdom at tuis.net
Sat Aug 11 12:37:04 PDT 2012


Hi Björn, everyone.


I have just committed a fix for this issue. This issue affects only 
people who serialize *subclasses* of the JDOM core classes (like custom 
subclasses of Element, Text, etc.).

The fix for this issue is 'trivial' and has no negative impact on any 
compatibility requirements. On the other hand, the commit includes a 
number of new classes that support the test-cases for the fix.

Like previous issues that have been identified in JDOM 2.x, I will issue 
a hotfix package on GitHub, and then, in a short while (in this case, 3 
weeks) issue a new version of JDOM (in this case, 2.0.3).

Thus, I have uploaded the 'hotfix' to GitHub here:

   https://github.com/downloads/hunterhacker/jdom/jdom-2.x-issue88.zip

and at month-end (August 31st or September 1st or 2nd) I will do a full 
release of JDOM 2.0.3.

This allows an opportunity for some some other potential issues to be 
identified and fixed without having a flood of new versions.

If you have any issues, suggestions, questions (even Javadoc comment 
issues) then please speak up so that they can be fixed in the upcoming 
release.

Thanks all

Rolf


On 10/08/2012 6:57 AM, Rolf Lear wrote:
> Excellent. It was quite a headscratcher....
>
> I will start the 2.0.3 release process.
>
> Rolf
>
> Björn Buchner <b.buchner at isys-software.de> wrote:
> Am Freitag, 10. August 2012 08:15:09 schrieb Björn Buchner:
>  > Am Donnerstag, 9. August 2012 18:23:03 schrieb Rolf Lear:
>  >> Hmmm... in a moment of daftness, I attached the wrong file (more
>  >> haste...
>  >> less speed).
>  >>
>  >> here is the working CloneBase file.
>  >>
>  >>
>  >>
>  >> Rolf
>  >>
>  >> On Thu, 09 Aug 2012 11:51:38 -0400, Rolf Lear <jdom at tuis.net> wrote:
>  >>> Hi Björn, Oliver
>  >>>
>  >>> I have identified what the problem is...... this is not actually a Java
>  >>> bug, but it describes what the JDOM bug is... I think....
>  >>>
>  >>> http://bugs.sun.com/view_bug.do?bug_id=6522514
>  >>>
>  >>> What this implies is that there is an issue in the permissions of the
>  >> JDOM
>  >>> element hierarchy.
>  >>>
>  >>> in my understanding, it goes like this....
>  >>>
>  >>> org.jdom2.Element extends org.jdom2.Content.
>  >>> org.jdom2.Content extends org.jdom2.CloneBase.
>  >>> org.jdom2.CloneBase is a package-private (not public) class, and
>  >> CloneBase
>  >>> has no declared constructor (it has the default no-arg constructor).
>  >>>
>  >>> Your class 'MyElement' is not in the org.jdom2 package, so, it cannot
>  >>> 'see' the no-arg constructor for (package private) org.jdom2.CloneBase.
>  >>>
>  >>> Thus the MyElement class cannot be de-serialized.
>  >>>
>  >>> I have 'proven' that this is the logic fault by putting the MyElement
>  >>> class in the org.jdom2 package, and then, miraculously, the code works.
>  >>> When I get home I will try it again but instead with a 'protected'
>  >> no-arg
>  >>> constructor on org.jdom2.CloneBase, and the MyElement class in some
>  >> other
>  >>> package..... actually, I have just tried it now, and it works.....
>  >>>
>  >>> Thus, there are two work-arounds:
>  >>>   - putting your MyElement code in the org.jdom2 package....
>  >>>   - using the attached org.jdom2.CloneBase class which has a protected
>  >>> no-arg constructor.
>  >>>
>  >>>
>  >>> I have created a new issue (#88), and I have attached a working
>  >> CloneBase
>  >>> class you can add to your project temporarily.....
>  >>>
>  >>> I will push out JDOM 2.0.3
>  >>>
>  >>> Rolf
>  >>>
>  >>>
>  >>>
>  >>>
>  >>> On Thu, 9 Aug 2012 11:03:52 -0400, Oliver Ruebenacker
>  >>> <curoli at gmail.com>
>  >>> wrote:
>  >>>> Hello,
>  >>>>
>  >>>>    Rolf, it shouldn't be necessary to add these methods.
>  >>>>
>  >>>>    Björn, can you check the import statement for Element?
>  >>>>
>  >>>>       Take care
>  >>>>       Oliver
>  >>>>
>  >>>> On Thu, Aug 9, 2012 at 10:37 AM, Rolf Lear <jdom at tuis.net> wrote:
>  >>>>>
>  >>>>> Hi Björn
>  >>>>>
>  >>>>> I don't have my 'JDOM Laptop' with me at the moment, so I can't
>  >>>>> easily
>  >>>>> reproduce your problem, but, I suspect this is just an issue of
>  >>>>> implementing your own read/write object methods.
>  >>>>>
>  >>>>> What happens if you add the following methods to your 'MyElement'
>  >>> class?
>  >>>>> I
>  >>>>> believe this should fix things..... try it... :-)
>  >>>>>
>  >>>>>
>  >>>>>
>  >>>>>          /**
>  >>>>>           * Serialize out the MyElement.
>  >>>>>           *
>  >>>>>           * @serialData
>  >>>>>           * The Stream protocol is:
>  >>>>>           * <ol>
>  >>>>>           *   <li>Write the super Element class out...
>  >>>>>           * </ol>
>  >>>>>           *
>  >>>>>           * @param out where to write the Element to.
>  >>>>>           * @throws IOException if there is a writing problem.
>  >>>>>           */
>  >>>>>          private void writeObject(final ObjectOutputStream out)
>  >>>>> throws
>  >>>>>          IOException
>  >>>>> {
>  >>>>>                  out.defaultWriteObject();
>  >>>>>          }
>  >>>>>
>  >>>>>          /**
>  >>>>>           * Read a MyElement off the ObjectInputStream.
>  >>>>>           *
>  >>>>>           * @see #writeObject(ObjectOutputStream)
>  >>>>>           * @param in where to read the Element from.
>  >>>>>           * @throws IOException if there is a reading problem.
>  >>>>>           * @throws ClassNotFoundException when a class cannot be
>  >>>>> found
>  >>>>>           */
>  >>>>>          private void readObject(final ObjectInputStream in)
>  >>>>>                          throws IOException, ClassNotFoundException {
>  >>>>>                  in.defaultReadObject();
>  >>>>>          }
>  >>>>>
>  >>>>>
>  >>>>> Rolf
>  >>>>>
>  >>>>>
>  >>>>>
>  >>>>> On Thu, 09 Aug 2012 16:08:48 +0200, Björn Buchner
>  >>>>> <b.buchner at isys-software.de> wrote:
>  >>>>>> Hi Folks,
>  >>>>>>
>  >>>>>> I am using the JDOM 2.0.2 release and experienced some trouble when
>  >> it
>  >>>>>> comes to serialization.
>  >>>>>>
>  >>>>>> De-/serializing an Element object through the standard
>  >>>>>> ObjectOutput/InputStream is no problem. Trouble starts when I try to
>  >>>>>> deserialize an object of a class that inherits from Element.
>  >>>>>>
>  >>>>>> It always ends with a InvalidClassException: no valid constructor.
>  >>>>>> Normally this indicates that JRE is missing a public default
>  >>>>>> constructor, but as you can see in the example below the subclass
>  >>>>>> has a default constructor.
>  >>>>>>
>  >>>>>> Thanks in advance for your help
>  >>>>>>
>  >>>>>> Example code:
>  >>>>>>
>  >>>>>> public class MyElement extends Element {
>  >>>>>>
>  >>>>>>       private static final long serialVersionUID =
>  >>> -4220756491425652053L;
>  >>>>>>
>  >>>>>>       public MyElement() {
>  >>>>>>           super();
>  >>>>>>       }
>  >>>>>>
>  >>>>>>
>  >>>>>>       public static void main(String ... args) throws IOException,
>  >>>>>> ClassNotFoundException {
>  >>>>>>          ByteArrayOutputStream buffer = new ByteArrayOutputStream();
>  >>>>>>          ObjectOutputStream outStream = new
>  >> ObjectOutputStream(buffer);
>  >>>>>>
>  >>>>>>          MyElement element = new MyElement();
>  >>>>>>
>  >>>>>>          outStream.writeObject(element);
>  >>>>>>          outStream.flush();
>  >>>>>>          ObjectInputStream inStream = new ObjectInputStream(new
>  >>>>>> ByteArrayInputStream(buffer.toByteArray()));
>  >>>>>>          element = (MyElement)inStream.readObject();
>  >>>>>>       }
>  >>>>>> }
>  >>>>>>
>  >>>>>> Result:
>  >>>>>>
>  >>>>>> Exception in thread "main" java.io.InvalidClassException:
>  >>>>>> <packageremoved>; no valid constructor
>  >>>>>>       at
>  >>>>>>
>  >>>>>
>  >>>
>  >>
> java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:147)
>  >>
>  >>>>>>       at
>  >>>>>>
>  >> java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:755)
>  >>>>>>       at
>  >>>>>>
>  >>>>>
>  >>>
>  >>
> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1751)
>  >>
>  >>>>>>       at
>  >>>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
>  >>>>>>       at
>  >>> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
>  >>>>>>       at <packageremoved>.main(MyElement.java:29)
>  >>>>> _______________________________________________
>  >>>>> To control your jdom-interest membership:
>  >>>>>
>  >> http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com
>  >
>  > Hi guys,
>  >
>  > thank you for your quick responses. I will try out the solution with
>  > the altered CloneBase class.
>  >
>  > Kind Regards
>  >
>  > Bjoern
>  >
>  > --
>  > iSYS Software GmbH
>  >
>  > Björn Buchner
>  >
>  > Tel: +49 (0) 89 46 23 28-0 | Fax  (0) 89 46 23 28-14
>  > email: b.buchner at isys-software.de
>  > Grillparzerstr. 10 | D-81675 Muenchen
>  > www.isys-software.de
>  >
>  > Sitz der Gesellschaft: München | HRB 111760
>  > Geschaeftsfuehrer: Prof. Dr. Peter Mandl und Michael Sailer
>  > _______________________________________________
>  > To control your jdom-interest membership:
>  > http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com
>
> The updated version is working for me. Thank you Rolf.
>
> Kind Regards
>
> Bjoern
>
> --
> iSYS Software GmbH
>
> Björn Buchner
>
> Tel: +49 (0) 89 46 23 28-0 | Fax  (0) 89 46 23 28-14
> email: b.buchner at isys-software.de
> Grillparzerstr. 10 | D-81675 Muenchen
> www.isys-software.de
>
> Sitz der Gesellschaft: München | HRB 111760
> Geschaeftsfuehrer: Prof. Dr. Peter Mandl und Michael Sailer
>
>
>
> _______________________________________________
> To control your jdom-interest membership:
> http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com
>



More information about the jdom-interest mailing list