【问题标题】:How to Seralize non-generic IList with Objects with XMLSerializer如何使用 XMLSerializer 序列化具有对象的非泛型列表
【发布时间】:2012-08-09 07:32:04
【问题描述】:

我正在尝试序列化一些对象,其中包含带有子元素的IListIList 是非通用的,我不能只使用通用的。 我得到像“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;
    ...
}

【问题讨论】:

  • 您正在尝试序列化 MyEntryViewItem 的集合,这个类是什么?该错误还涉及您尚未放入上下文的另一个类 MyObjectChild。我认为更多信息会有很大帮助!
  • 这只是一个基本类,其中包含一些我想要序列化的属性(主要是字符串)。但其中一个属性是一个 IList,其元素类型为 ElementChild...
  • MyObjectChild 和 ElementChild 一样...我把名字弄混了...

标签: c# xmlserializer


【解决方案1】:

根据Simon Hewitt,您可以只使用XmlInclude 来指定列表的类型。可以在roboxman.wordpress.com找到替代方案@

【讨论】:

    【解决方案2】:

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

    XmlSerializer 对以下类进行特殊处理 实现 IEnumerable 或 ICollection。一个实现的类 IEnumerable 必须实现一个公共的 Add 方法,该方法采用单个 范围。 Add 方法的参数必须与 is 相同类型 从 Current 属性返回的值 GetEnumerator,或该类型的基数之一。一个实现的类 ICollection(如 CollectionBase)除了 IEnumerable 必须 有一个公共 Item 索引属性(C# 中的索引器),它接受一个 整数,并且它必须具有整数类型的公共 Count 属性。这 Add 方法的参数必须与返回的类型相同 Item 属性,或该类型的基础之一。上课 实现ICollection,将检索要序列化的值 从索引的 Item 属性,而不是通过调用 GetEnumerator。

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2020-10-08
      • 2010-11-10
      相关资源
      最近更新 更多