[Mono-list] XML Serialization - difference between WinCLR and Mono runtime

MarLOne InfoSeeker002 at gmail.com
Wed May 1 04:08:42 UTC 2013


Not sure if this has been reported - there is difference in runtime
treatment of XML Serialization between CLR and Mono runtime. 

I have a class like this:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;

namespace SerializationDemos
    [ Serializable ]
    public class WithAutoProperty
        // Read only properties
        public String Name { get; private set; } // private setter
        public Int32 Age { get; private set; }     // private setter

        public WithAutoProperty() { }

        public WithAutoProperty( string name, Int32 age )
            this.Name = name;
            this.Age = age;

and I have a nunit test code like this:
        public void WithUsingAutoProperty()
            String expectedName = Guid.NewGuid().ToString();
            Int32 expectedAge = 28;
            WithAutoProperty p = new WithAutoProperty( expectedName,
expectedAge );
            UsingXmlSerialization( p, ( a, b ) =>
                        Assert.IsNotNull( a );
                        Assert.IsTrue( a is WithAutoProperty );
                        Assert.IsNotNull( b );
                        WithAutoProperty g = b as WithAutoProperty;
                        Assert.AreEqual( expectedName, g.Name );
                        Assert.AreEqual( expectedAge, g.Age );
                    } );

        public void UsingXmlSerialization(Object expected, Action<object,
object> testNow)
            StringBuilder buffer = new StringBuilder();
            Type t = expected.GetType();
            using ( XmlWriter writer = XmlWriter.Create( buffer ) )
                XmlSerializer ser = new XmlSerializer( t );
                ser.Serialize( writer, expected );

            String xmlDoc = buffer.ToString();
            Console.WriteLine( "Xml: {0}", xmlDoc );
            buffer = null;

            Object regen = null;
            using ( XmlReader reader = XmlReader.Create( new StringReader(
xmlDoc ) ) )
                XmlSerializer ser = new XmlSerializer( t );
                regen = ser.Deserialize( reader );
                Assert.IsNotNull( regen );
            testNow( expected, regen );

I built an assembly in VS2010 using .Net4. 

Naturally according to the .Net specification, the test method
WithUsingAutoProperty() fails with a message like this:
System.InvalidOperationException : Unable to generate a temporary class
error CS0200: Property or indexer 'SerializationDemos.WithAutoProperty.Name'
cannot be assigned to -- it is read only
error CS0200: Property or indexer 'SerializationDemos.WithAutoProperty.Age'
cannot be assigned to -- it is read only

Then I took the assembly over to my Ubuntu 12.04 with Mono running and NUnit
ran through that method with a green bar.

This difference in behaviour is a source of concern.

Has anyone discovered this? I am using Mono-runtime version

It appears the Mono runtime simply ignoring the private accessor of the
getters and setting the value anyway in contravention to the specification.

I have the same result if I rebuild this project with MonoDevelop in
Ubuntu 12.04. Hence it does not indicate the generation of IL code at fault
but it is in the runtime.


View this message in context: http://mono.1490590.n4.nabble.com/XML-Serialization-difference-between-WinCLR-and-Mono-runtime-tp4659562.html
Sent from the Mono - General mailing list archive at Nabble.com.

More information about the Mono-list mailing list