如何使用XMLSerializer将对象与非对象分开使用

问题描述:

我试图序列化一些对象,其中包含带有子元素的IListIList是非泛型的,我不能只是通用的。 我得到异常像“The Type MyObjectChild was not expected。...”,它说了一些关于XMLInclude,但我不认为这就是我正在寻找。 有没有人有任何想法如何使XMLSerialzer序列化子元素? 这两个元素是[Serializable]如何使用XMLSerializer将对象与非对象分开使用

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; 
    ... 
} 
+0

您正试图序列化MyEntryViewItem的集合,这个类是什么?此外,错误是指您还没有将其放入上下文MyObjectChild的另一个Clas。我想更多的信息会帮助很多! – 2012-08-09 07:38:46

+0

这只是一个基本的类与一些属性(主要是字符串),我想序列化。但其中一个属性是一个元素类型为ElementChild的IList ... – JonSchn 2012-08-09 07:42:17

+0

MyObjectChild与ElementChild相同...我混合了名称... – JonSchn 2012-08-09 07:42:42

根据Simon Hewitt您可以使用XmlInclude来指定列表的类型。另一种选择可以在roboxman.wordpress.com

XmlSerializer的治疗IList的特殊方式(实际上的ICollection和IEnumerable,但是IList的是两者)。有一份关于XmlSerializer MSDN页:

XmlSerializer的给予特别的待遇, 实现IEnumerable或ICollection的类。一个实现了 IEnumerable的类必须实现一个公共的Add方法,该方法只需要一个参数 。 Add方法的参数必须与从 GetEnumerator返回的值的当前属性返回的 或该类型的其中一个基类相同。实现 ICollection(如CollectionBase)的类除了IEnumerable必须具有 之外,还必须具有公用项目索引属性(C#中的索引器),该整数采用 整数,且必须具有integer类型的公用Count属性。 Add方法的参数 必须与从Item属性 返回的类型相同,或者是该类型的基础类型之一。对于实现ICollection的类 ,要被序列化的值将从索引的Item属性中检索 ,而不是通过调用GetEnumerator。