History | Log In     View a printable version of the current page.  
Issue Details (XML | Word | Printable)

Key: XSTR-245
Type: Bug Bug
Status: Closed Closed
Resolution: Fixed
Assignee: Unassigned
Reporter: Philip Gust
Votes: 0
Watchers: 2
Operations

If you were logged in you would be able to see more operations.
XStream

Broken XML output serializing class with custom writeObject()

Created: 27/Sep/05 11:21 AM   Updated: 07/Aug/06 09:19 PM
Component/s: None
Affects Version/s: None
Fix Version/s: 1.2

File Attachments: 1. Java Source File Class1.java (1 kb)
2. XML File Class1.xml (0.4 kb)
3. Java Source File SerializableConverterTest.java (4 kb)
4. Text File XSTR-245-0.1-draft.patch (20 kb)
5. Text File XSTR-245.patch (22 kb)


JDK version and platform: Sun 1.4.2_09 for Windows


 Description  « Hide
XStream generates bad XML of Class1 has a transient field class2 of type Class2 and has a custom writeObject() method that writes class2 before calling defaultWriteObject(). Class2 has a custom writeObject() method that simply calls defaultWriteObject(). The default section for Class1duplicates the default section for Class2 rather than the declared fields of Class1.

I wasn't sure how to generate a JUnit test for this, but I've attached a simple, stand-alone Java file with a simple test case that writes the XML to System.out.



 All   Comments   Change History      Sort Order: Ascending order - Click to sort in descending order
Philip Gust - 27/Sep/05 11:25 AM
This file contains the output from running the attached Class1.java. The XML for Class1's default section is wrong: it duplicates the default section for Class2.

Cyrille Le Clerc - 08/Jun/06 02:00 PM
Here is a proposed TestCase and a proposed draft version of a patch. If fixes the XSTR-245 but additional test cases should be added.

The main idea of the patch is to use a stack of callBacks in CustomObjectInputStream and CustomObjectOutputStream instead of the previous version that only hold the current callback.


Cyrille Le Clerc - 08/Jun/06 09:52 PM
Final version of a proposed patch.

Main idea :
Use a stack of StreamCallbacks in CustomObjectInputStream and CustomObjectOutputStream instead of the previous version that only hold the current streamCallback.

Comments:
Even if this bug was related to SerializableConverter, I modified ExternalizableConverter to apply the same pattern.

Modified files :

  • CustomObjectInputStream and CustomObjectOutputStream to add these stacks
  • SerializableConverter doMarshal and doUnmarshal to call popCallback()
    Note that pushCallback is not called by SerializableConverter but by CustomObjectOutputStream#getInstance
  • ExternalizableConverter same modifications as for SerializableConverter

Created files :

  • SerializationNestedWriteObjectsTest testcase in the acceptance package

Tests and build:
Patch was developped against subversion trunk #866. All the tests passed successfully and ant build succeeded


Joerg Schaible - 12/Jun/06 03:08 AM
I've applied a slightly modified patch of Cyrille. Cyrille & Philip, does this work for you?

Cyrille Le Clerc - 13/Jun/06 08:24 PM
It work successfully for me (svn revision 870).