This is Xamarin's bug tracking system. For product support, please use the support links listed in your Xamarin Account.
Bug 2907 - XML "choice" not correclty processed during deserialization
: XML "choice" not correclty processed during deserialization
Status: RESOLVED FIXED
Product: Class Libraries
Classification: Mono
Component: Sys.XML
: 2.10.x
: PC Windows
: --- normal
: ---
Assigned To: Lluis Sanchez
:
:
:
:
  Show dependency treegraph
 
Reported: 2012-01-16 01:35 EST by Josef Semmler
Modified: 2012-12-12 03:52 EST (History)
4 users (show)

See Also:
Tags:
Test Case URL:
External Submit: ---


Attachments
example for the choice issue (4.72 KB, application/x-zip-compressed)
2012-01-18 06:07 EST, Josef Semmler
Details
Fixes deserialization of choice with ordered read. (59.73 KB, patch)
2012-11-01 05:14 EDT, Roman
Details | Diff
Fix for failed tests (3.54 KB, patch)
2012-12-11 08:56 EST, Roman
Details | Diff

Description Josef Semmler 2012-01-16 01:35:34 EST
I have a xml schema file which uses a "choice".
I used xsd to generate a class file for that schema.

When i now try to deserialize a XML file based on that schema into a class
instance i get the following error message

Unhandled Exception: System.InvalidOperationException: There is an error in XML
document. ---> System.InvalidOperationException: Read by order only possible
for encoded/bare format
  at System.Xml.Serialization.ClassMap.GetElement (Int32 index) [0x00000] in
<filename unknown>:0
  at System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadMembers
(System.Xml.Serialization.ClassMap map, System.Object ob, Boolean isValueList,
Boolean readBySoapOrder) [0x00000] in <filename unknown>:0
  at
System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadClassInstanceMembers
(System.Xml.Serialization.XmlTypeMapping typeMap, System.Object ob) [0x00000]
in <filename unknown>:0
  at
System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadClassInstance
(System.Xml.Serialization.XmlTypeMapping typeMap, Boolean isNullable, Boolean
checkType) [0x00000] in <filename unknown>:0
  at System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadObject
(System.Xml.Serialization.XmlTypeMapping typeMap, Boolean isNullable, Boolean
checkType) [0x00000] in <filename unknown>:0
  at System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadRoot
(System.Xml.Serialization.XmlTypeMapping rootMap) [0x00000] in <filename
unknown>:0
  at System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadRoot ()
[0x00000] in <filename unknown>:0
  at System.Xml.Serialization.XmlSerializer.Deserialize
(System.Xml.Serialization.XmlSerializationReader reader) [0x00000] in <filename
unknown>:0
  --- End of inner exception stack trace ---

The code itself works: It works with microsoft .net and works also pretty well
with with mono 2.6.7 ... but it seems that all mono version after 2.6.7 (2.8,
2.10) are no longer able to process the "choice" ?
Comment 1 Miguel de Icaza 2012-01-16 14:56:59 EST
Josef,

Would you mind providing a self-contained test case that exhibits the problem?

Please reopen the bug with the test case.
Comment 2 Josef Semmler 2012-01-18 06:07:50 EST
Created attachment 1223 [details]
example for the choice issue

The attached files contains two important files:

test2.xsd, which is the used schema (very simple)
and test2.cs, which is the generated class file from the xsd. This file has
been generated using
xsd test2.xsd /c /order

Important: The issue with mono only occurs, if the option "/order" was used -
if this option is not used, the test program run's without problems, too.
Comment 3 Josef Semmler 2012-02-23 05:55:39 EST
requested information was attached
Comment 4 Nicolas Raoul 2012-08-17 06:35:42 EDT
I wanted to use to DotCMIS library for a multiplatform application, but it uses
<xsd:choice> so Mono crashes.

I also confirm Josef's test case reproduces the bug.

Mono JIT compiler version 2.10.8.1 (Debian 2.10.8.1-1ubuntu2.2)

It has been 7 months, any idea when this bug will be fixed?
Comment 5 Nicolas Raoul 2012-08-23 07:07:35 EDT
I tried to fix that bug by commenting out the assertion at line 410 of
System.Xml.Serialization/XmlTypeMapping.cs

That prevents the exception from happening, but unfortunately the resulting
deserialized data is null.
So the problem must be somewhere else.
Comment 6 Josef Semmler 2012-09-13 05:02:02 EDT
@Raoul: If you don't need the latest additions to XmlSerialization, you can
work around this issue like this: 

Fetch the mono sources of the version you want (e.g. 2.10.9) - and the sources
of mono-2.6.7 (which is IMHO the last working version without that defect!).
Extract both source trees - then replace all files in
mcs/class/System.XML/System.Xml.Serialization with the files from 2.6.7 ...
configure and compile.

It is a stupid and dangerous workaround - but it seems to work for me.
Comment 7 Nicolas Raoul 2012-09-13 05:17:43 EDT
@Josef: Thanks for the tip! Unfortunately, I am developing a Mono app intended
to be downloaded by many users, and I can't ask them to mess with their system.

I am now using a workaround: I removed all "Order" parameters/lines in the code
generated by Visual C# (actually by the WSDL "Add Service" feature, which
probably uses xsd.exe). It seems to be working so far.
Comment 8 Nicolas Raoul 2012-09-13 06:13:34 EDT
I tested more, and I get this error:

There is an error in XML document.
at System.Xml.Serialization.XmlSerializer.Deserialize

So I guess I can't do without Order :-/
Which means I desperately need to fix this bug.
Comment 9 Nicolas Raoul 2012-09-14 05:24:46 EDT
I can confirm that Josef's hack works.
For anyone willing to use Mono for XML or web services, here is how to fix the
problem on Ubuntu:

mkdir mono-fix2907
cd mono-fix2907
sudo apt-get install devscripts fakeroot
sudo apt-get build-dep mono-runtime
export DEB_BUILD_OPTIONS="debug nostrip noopt"
fakeroot apt-get source -b mono-runtime
rm -rf mono-2.10.8.1/mcs/class/System.XML/System.Xml.Serialization
cd ..
mkdir mono-2-6-7
cd mono-2-6-7
git clone git://github.com/mono/mono.git
git checkout mono-2-6-7
cd ../mono-fix2907
cp -r ../mono-2-6-7/mcs/class/System.XML/System.Xml.Serialization
mono-2.10.8.1/mcs/class/System.XML/
cd mono-2.10.8.1
dpkg-buildpackage -rfakeroot -uc -b
cd ..
sudo dpkg -i --force-overwrite *.deb
Comment 10 Roman 2012-11-01 05:14:54 EDT
Created attachment 2828 [details]
Fixes deserialization of choice with ordered read.

I have added the patch that fixed ordered deserialization of array of choices.
Should work for single choices too.

Sorry, patch also makes line endings consistent (LF) and formats some lines
(MSVS-style).

I am not sure it won't break something since the code was not pretty and some
things remained unclear. Developers definitely should add some
xml-documentation...
Comment 11 Nicolas Raoul 2012-11-02 03:33:55 EDT
I created a pull request from Roman's patch:
https://github.com/mono/mono/pull/495

I cancelled the formatting changes to make the diff easier to understand:
https://github.com/nicolas-raoul/mono/commit/f72fc52
Comment 12 Miguel de Icaza 2012-11-02 09:44:52 EDT
Lluis, can you review the provided patch on github?

Nicolas/Roman: any chance you guys can provide a test case that we can use to
validate the fix?

Comment #2 contains a test case
Comment 13 Nicolas Raoul 2012-11-02 09:54:44 EDT
Miguel, I will write a test case within 3 days, based on the test case in
comment 2.
Note: I have not tested the patch yet.
Comment 14 Nicolas Raoul 2012-11-05 03:16:29 EST
I wrote a test in "mono/tests" and sent a pull request:
https://github.com/nicolas-raoul/mono/commits/unit-test-for-issue2907
I tried to follow the guidelines and patterns observed in other tests.

That might a problem with my setup, but recently I get "mdoc: There is an error
in XML document" messages, and a person called Jester explained how it might be
due to the patch:
http://stackoverflow.com/a/13215059/226958
Comment 15 Roman 2012-11-05 09:39:36 EST
Yep. My mistake. Since all memers in my program are marked with Order, i've
never run into it.
Comment 16 Nicolas Raoul 2012-11-06 00:24:58 EST
I fixed my patch branch, now MDOC and everything build fine.
Pull request: https://github.com/mono/mono/pull/495/commits
Comment 17 Miguel de Icaza 2012-12-07 16:58:20 EST
Thanks, patch applied!
Comment 18 Roman 2012-12-11 08:56:03 EST
Created attachment 3080 [details]
Fix for failed tests

I addded one more patch to fix failed tests reported here
https://github.com/mono/mono/pull/495 by garuma.
Patch must be applied after the previous one.
Comment 19 Roman 2012-12-12 03:52:35 EST
Created pull request https://github.com/mono/mono/pull/522

Note You need to log in before you can comment on or make changes to this bug.