Re: Serialization Trouble through Inheritance
Björn Buchner <[email protected]> Fri, 10 Aug 2012 08:15:09 +0200
| Newsgroups | gmane.comp.java.jdom.general |
|---|---|
| Message-ID | <[email protected]> |
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 <[email protected]> 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 <[email protected]> >> 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 <[email protected]> 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 >>>> <[email protected]> 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/[email protected] 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: [email protected] 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/[email protected]