[Mono-list] XmlSerializer trouble
Christian Glodt
chris@mind.lu
Thu, 01 Apr 2004 23:46:07 +0200
--=-d7MhbDEE1On0sN6clCFP
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
Hi,
in a program that I am currently developing, I am encountering
some problems with xml serialization. I am trying to serialize the
application's model (which has some inheritance) by passing the
root of the model's object graph to the serializer. A reduced version
of the code which demonstrates the problem is attached.
I get the following output:
<?xml version="1.0" encoding="iso-8859-1"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Site>
<Entries />
<Sections>
<anyType
Unhandled Exception: System.InvalidOperationException: Invalid type:
Section
in <0x00142>
System.Xml.Serialization.XmlSerializationWriter:WriteTypedPrimitive
(string,string,object,bool)
in <0x0027f>
System.Xml.Serialization.XmlSerializationWriterInterpreter:WriteObject
(System.Xml.Serialization.XmlTypeMapping,object,string,string,bool,bool,bool)
in <0x0099b>
System.Xml.Serialization.XmlSerializationWriterInterpreter:WriteMemberElement (System.Xml.Serialization.XmlTypeMapElementInfo,object)
in <0x003bb>
System.Xml.Serialization.XmlSerializationWriterInterpreter:WriteListContent (System.Xml.Serialization.TypeData,System.Xml.Serialization.ListMap,object,System.Text.StringBuilder)
in <0x00750>
System.Xml.Serialization.XmlSerializationWriterInterpreter:WriteMemberElement (System.Xml.Serialization.XmlTypeMapElementInfo,object)
in <0x0017c>
System.Xml.Serialization.XmlSerializationWriterInterpreter:WriteElementMembers (System.Xml.Serialization.ClassMap,object,bool)
in <0x00056>
System.Xml.Serialization.XmlSerializationWriterInterpreter:WriteObjectElementElements (System.Xml.Serialization.XmlTypeMapping,object)
in <0x000d3>
System.Xml.Serialization.XmlSerializationWriterInterpreter:WriteObjectElement (System.Xml.Serialization.XmlTypeMapping,object,string,string)
in <0x0035c>
System.Xml.Serialization.XmlSerializationWriterInterpreter:WriteObject
(System.Xml.Serialization.XmlTypeMapping,object,string,string,bool,bool,bool)
in <0x0099b>
System.Xml.Serialization.XmlSerializationWriterInterpreter:WriteMemberElement (System.Xml.Serialization.XmlTypeMapElementInfo,object)
in <0x002a3>
System.Xml.Serialization.XmlSerializationWriterInterpreter:WriteElementMembers (System.Xml.Serialization.ClassMap,object,bool)
in <0x00056>
System.Xml.Serialization.XmlSerializationWriterInterpreter:WriteObjectElementElements (System.Xml.Serialization.XmlTypeMapping,object)
in <0x000d3>
System.Xml.Serialization.XmlSerializationWriterInterpreter:WriteObjectElement (System.Xml.Serialization.XmlTypeMapping,object,string,string)
in <0x0035c>
System.Xml.Serialization.XmlSerializationWriterInterpreter:WriteObject
(System.Xml.Serialization.XmlTypeMapping,object,string,string,bool,bool,bool)
in <0x0013a>
System.Xml.Serialization.XmlSerializationWriterInterpreter:WriteRoot
(object)
in <0x00095> System.Xml.Serialization.XmlSerializer:Serialize
(object,System.Xml.Serialization.XmlSerializationWriter)
in <0x000db> System.Xml.Serialization.XmlSerializer:Serialize
(System.Xml.XmlWriter,object,System.Xml.Serialization.XmlSerializerNamespaces)
in <0x0005b> System.Xml.Serialization.XmlSerializer:Serialize
(System.IO.TextWriter,object)
in <0x00050> MainClass:Main (string[])
I wonder if I am making some mistake, or if there is a problem with
serialization. As far as I can see from MSDN docs this should just work.
Also, in java this kind of thing just works (although not with xml).
I appreciate any kind of help - this is my first C#/mono program.
Mono/mcs is version 0.31 on Debian unstable. I had the same problem
with 0.30.2.
Please CC me in your replies. I'm not subscribed but I follow the
archives.
Thanks & Cheers,
Christian Glodt
--=-d7MhbDEE1On0sN6clCFP
Content-Disposition: attachment; filename=testcase.cs
Content-Type: text/x-csharp; name=testcase.cs; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
using System;
using System.Xml.Serialization;
using System.Collections;
class MainClass {
public static void Main(string[] args) {
Root root = Root.createDefault();
XmlSerializer ser = new XmlSerializer(typeof(Root));
ser.Serialize(Console.Out, root);
}
}
public abstract class TreeNode {
// Only for serialization
public TreeNode() {}
protected Root root;
public Root Root {
get {
return root;
}
}
public TreeNode(Root root) {
this.root = root;
}
public abstract ArrayList GetChildren();
public abstract void RemoveChild(TreeNode child);
}
public class Root {
// Only for serialization
public Root() {}
private Site site;
public Site Site {
set {
site = value;
}
get {
return site;
}
}
public static Root createDefault() {
Root root = new Root();
root.Site = new Site(root);
root.Site.addSection(new Section(root));
((Section)root.Site.Sections[0]).addPage(new Page(root));
((Page)((Section)root.Site.Sections[0]).Pages[0]).addEntry(new Entry(root));
return root;
}
}
public class Site : Page {
// Only for serialization
public Site() {}
private ArrayList sections = new ArrayList();
public ArrayList Sections {
get {
return sections;
}
}
public Site(Root root) : base(root) {
}
public void addSection(Section s) {
sections.Add(s);
}
public void removeSection(Section s) {
sections.Remove(s);
}
override public ArrayList GetChildren() {
ArrayList res = new ArrayList();
res.AddRange(this.sections);
res.AddRange(this.Entries);
return res;
}
override public void RemoveChild(TreeNode child) {
if (this.sections.Contains(child)) this.removeSection((Section)child);
if (this.Entries.Contains(child)) this.removeEntry((Entry)child);
}
}
public class Section : Page {
// Only for serialization
public Section() {}
private ArrayList pages = new ArrayList();
public ArrayList Pages {
get {
return pages;
}
}
private ArrayList sections = new ArrayList();
public ArrayList Sections {
get {
return sections;
}
}
public Section(Root root) : base(root) {
}
public void addPage(Page p) {
pages.Add(p);
}
public void removePage(Page p) {
pages.Remove(p);
}
public void addSection(Section s) {
sections.Add(s);
}
public void removeSection(Section s) {
sections.Remove(s);
}
override public ArrayList GetChildren() {
ArrayList res = new ArrayList();
res.AddRange(this.sections);
res.AddRange(this.pages);
res.AddRange(this.Entries);
return res;
}
override public void RemoveChild(TreeNode child) {
if (this.sections.Contains(child)) this.removeSection((Section)child);
if (this.pages.Contains(child)) this.removePage((Page)child);
if (this.Entries.Contains(child)) this.removeEntry((Entry)child);
}
}
public class Page : TreeNode {
// Only for serialization
public Page() {}
private ArrayList entries = new ArrayList();
public ArrayList Entries {
get {
return entries;
}
}
public Page(Root root) : base(root) {
}
public void addEntry(Entry e) {
entries.Add(e);
}
public void removeEntry(Entry e) {
entries.Remove(e);
}
override public ArrayList GetChildren() {
return this.entries;
}
override public void RemoveChild(TreeNode child) {
if (this.Entries.Contains(child)) this.removeEntry((Entry)child);
}
}
public class Entry : TreeNode {
// Only for serialization
public Entry() {}
public Entry(Root root) : base(root) {
}
override public ArrayList GetChildren() {
return new ArrayList();
}
override public void RemoveChild(TreeNode child) {
}
}
--=-d7MhbDEE1On0sN6clCFP--