[Mono-list] Problem with XML Serialization under mono
Petit Eric
surfzoid at gmail.com
Sat Aug 23 17:43:06 EDT 2008
Can yu change Xml for Binary , yes ? so try this code :
http://www.csharpfr.com/codes/SERIALIZER-ARBORESCENCE-TREEVIEW_33925.aspx
this one sample show the 3 technic of serialzation :
http://www.csharpfr.com/codes/UTILISER-TECHNIQUES-SERIALISATION-DOTNET-VOIR-RESULTATS_18734.aspx
and this one is to use the xml config file with serialization technic,
so should work with all types :
http://www.csharpfr.com/codes/XMLSERIALIZER-FICHIERS-CONFIG_21940.aspx
2008/8/23 Petit Eric <surfzoid at gmail.com>:
> Perhap's you should post a bug at
> http://en.opensuse.org/Build_Service#Build_Service_Clients with this
> test class as attached testcase ?
>
> 2008/8/20 Christian Hobelsberger <hobi1972 at gmail.com>:
>> Hi,
>>
>> i have some code which works well under microsoft .net, but completly fails
>> under mono ... maybe someone can give me a hint how to fix - or at
>> workaround!?
>>
>> The purpose of the code is to have a class, which can store a item of a
>> instance of an unknown type - and produce a xml serialization from it.
>> Usually when you try to serialize a class with an unknown instance, you'll
>> get a "class ... not expected" exception from the serializer - as the can
>> only serialize classes, which he was aware of while he was created.
>> The "trick" is to use a wrapper class, which can handle the unknown classes
>> and tell the serializer to replace the real object with that wrapper in the
>> serialization process.
>> (the concept was found here
>> http://www.codeproject.com/KB/XML/xmlserializerforunknown.aspx?fid=120909&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=1798222#xx1798222xx)
>>
>> With .net the below code works without problems and gives the
>> correct/expected result ... but using mono (1.9.1 under windows/linux)
>> results in
>> Unhandled Exception: System.InvalidOperationException: There was an error
>> generating the XML document. ---> System.InvalidCastException: Cannot cast
>> from source type to destination type.
>> at
>> System.Xml.Serialization.XmlSerializationWriterInterpreter.WriteMemberElement
>> (System.Xml.Serialization.XmlTypeMapElementInfo elem, System.Object
>> memberValue) [0x00000]
>> at
>> System.Xml.Serialization.XmlSerializationWriterInterpreter.WriteElementMembers
>> (System.Xml.Serialization.ClassMap map, System.Object ob, Boolean
>> isValueList) [0x00000]
>> ...
>>
>> Here is the code:
>>
>> using System;
>> using System.IO;
>> using System.Xml;
>> using System.Xml.Schema;
>> using System.Xml.Serialization;
>>
>> namespace SerialMonoBug
>> {
>> class Program
>> {
>> static void Main(string[] args)
>> {
>> String s = "";
>>
>> TestClass a = new TestClass();
>> DerivedClass_1 d1 = new DerivedClass_1();
>>
>> a.Item = d1;
>> s = a.ToString_2();
>>
>> System.Console.WriteLine(String.Format("{0}\n------------------------\n",
>> s));
>> }
>> }
>>
>> public class UnknownItemSerializer : IXmlSerializable
>> {
>> public BaseClass Item;
>>
>> public UnknownItemSerializer() { }
>> public UnknownItemSerializer(BaseClass item) { this.Item = item; }
>>
>> public static implicit operator UnknownItemSerializer(BaseClass p) {
>> System.Console.WriteLine("converting to UnknownItemSerialzer");
>> return p == null ? null : new UnknownItemSerializer(p);
>> }
>>
>> public static implicit operator BaseClass(UnknownItemSerializer p) {
>> System.Console.WriteLine("converting to BaseClass");
>> return p == null ? null : p.Item;
>> }
>>
>> public XmlSchema GetSchema() { return null; }// not implemented
>> public void ReadXml(XmlReader reader) { return; } // not implemented
>>
>> public void WriteXml(XmlWriter writer)
>> {
>> writer.WriteAttributeString("type", String.Format("{0}, {1}",
>> Item.GetType().ToString(), Item.GetType().Assembly.ToString()));
>> new XmlSerializer(Item.GetType()).Serialize(writer, Item);
>> }
>> }
>>
>> public class TestClass
>> {
>> public BaseClass Item;
>>
>> public string ToString_2() {
>> string result = "";
>>
>> using (System.IO.MemoryStream stream = new
>> System.IO.MemoryStream())
>> using (System.IO.StreamReader sr = new
>> System.IO.StreamReader(stream))
>> using (XmlTextWriter writer = new XmlTextWriter(stream,
>> System.Text.Encoding.UTF8))
>> {
>> XmlAttributes attrs = new XmlAttributes();
>> XmlElementAttribute attr = new XmlElementAttribute();
>> attr.ElementName = "UnknownItemSerializer";
>> attr.Type = typeof(UnknownItemSerializer);
>> attrs.XmlElements.Add(attr);
>> XmlAttributeOverrides attrOverrides = new
>> XmlAttributeOverrides();
>> attrOverrides.Add(typeof(TestClass), "Item", attrs);
>>
>> XmlSerializer serializer = new XmlSerializer(this.GetType(),
>> attrOverrides);
>>
>> serializer.Serialize(writer, this);
>>
>> stream.Position = 0;
>> result = sr.ReadToEnd();
>> }
>>
>> return result;
>> }
>> }
>>
>> public class BaseClass {
>> }
>>
>> public class DerivedClass_1 : BaseClass {
>> public int value = 10;
>> }
>>
>> public class DerivedClass_2 : BaseClass {
>> public string strValue = "testString";
>> }
>> }
>>
>>
>> Anyone an idea what's going wrong here?
>>
>> thanks
>> CHH
>>
>>
>>
>> _______________________________________________
>> Mono-list maillist - Mono-list at lists.ximian.com
>> http://lists.ximian.com/mailman/listinfo/mono-list
>>
>>
>
>
>
> --
>
> Cordially.
>
> Small Eric Quotations of the days:
> ---------------------------------------------------------------------------
> If one day one reproaches you that your work is not a work of
> professional, say you that:
> Amateurs built the arch of Noah, and professionals the Titanic.
> ---------------------------------------------------------------------------
>
> Few people are done for independence, it is the privilege of the powerful ones.
> ---------------------------------------------------------------------------
>
> No key was wounded during the drafting of this message.
>
--
Cordially.
Small Eric Quotations of the days:
---------------------------------------------------------------------------
If one day one reproaches you that your work is not a work of
professional, say you that:
Amateurs built the arch of Noah, and professionals the Titanic.
---------------------------------------------------------------------------
Few people are done for independence, it is the privilege of the powerful ones.
---------------------------------------------------------------------------
No key was wounded during the drafting of this message.
More information about the Mono-list
mailing list