如何使用XMLSerializer序列化具有对象的非泛型IList

时间:2012-08-09 07:32:05

标签: c# xmlserializer

我正在尝试序列化一些包含带有子元素的IList的对象。 IList是非通用的,我不能只在通用的那个。 我得到了一个例外,比如“MyObjectChild类型没有被期待......”并且它说了一些关于XMLInclude的内容,但我不认为那就是我正在搜索的内容。 有没有人知道如何使XMLSerialzer序列化子元素? 两个元素都是[Serializable]

XmlSerializer xmlSerializer = new XmlSerializer(typeof ObservableCollection<MyEntryViewItem>));
FileStream fileStream = new FileStream(exportPath, FileMode.Create);

xmlSerializer.Serialize(fileStream, _listEntries);

public IList ElementChildren { get { return _item.Children; } set { _item.Children = value; RaisePropertyChanged(() => ElementChildren); } }

[Serializable]
public sealed class ElementChild
{
    private int _id;
    private string _text;
    private string _path;
    ...
}

2 个答案:

答案 0 :(得分:1)

根据Simon Hewitt,您只需使用XmlInclude指定列表的类型即可。可以在roboxman.wordpress.com

找到替代方案

答案 1 :(得分:0)

XmlSerializer以特殊方式处理IList(实际上是ICollection和IEnumerable,但IList都是)。 XmlSerializer MSDN页面上有注释:

  

XmlSerializer为类提供特殊处理   实现IEnumerable或ICollection。实现的类   IEnumerable必须实现一个单一的公共Add方法   参数。 Add方法的参数必须与原来的类型相同   从Current属性返回的返回值   GetEnumerator,或该类型的基础之一。实现的类   除了IEnumerable之外,ICollection(如CollectionBase)必须   有一个公共项索引属性(C#中的索引器)   整数,它必须具有整数类型的公共Count属性。该   Add方法的参数必须与返回的类型相同   Item属性,或该类型的基础之一。对于课程   实现ICollection时,将检索要序列化的值   来自索引的Item属性,而不是通过调用GetEnumerator。