[jdom-interest] Serialization Trouble through Inheritance

Björn Buchner b.buchner at isys-software.de
Thu Aug 9 23:15:09 PDT 2012


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


More information about the jdom-interest mailing list