[jdom-interest] Serialization Trouble through Inheritance

Björn Buchner b.buchner at isys-software.de
Fri Aug 10 02:37:32 PDT 2012


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


More information about the jdom-interest mailing list