[jdom-interest] Serialization Trouble through Inheritance
Rolf Lear
jdom at tuis.net
Thu Aug 9 07:37:24 PDT 2012
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)
More information about the jdom-interest
mailing list