如何使用XMLSerializer将对象与非对象分开使用
问题描述:
我试图序列化一些对象,其中包含带有子元素的IList
。 IList
是非泛型的,我不能只是通用的。 我得到异常像“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;
...
}
答
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。
您正试图序列化MyEntryViewItem的集合,这个类是什么?此外,错误是指您还没有将其放入上下文MyObjectChild的另一个Clas。我想更多的信息会帮助很多! – 2012-08-09 07:38:46
这只是一个基本的类与一些属性(主要是字符串),我想序列化。但其中一个属性是一个元素类型为ElementChild的IList ... – JonSchn 2012-08-09 07:42:17
MyObjectChild与ElementChild相同...我混合了名称... – JonSchn 2012-08-09 07:42:42