在C#中序列化一个arraylist

我有一个包含许多标准字段和一个arraylist的类。

有没有办法使用XmlSerializer序列化类?

到目前为止尝试导致错误消息说:

 未处理的exception:System.InvalidOperationException:发生错误
生成XML文档。  ---> System.InvalidOperationException:类型
不期望XMLSerialization.DataPoints。 使用XmlInclude或
 SoapInclude属性用于指定静态未知的类型。 

类的一些截断表示如下所示:

public class StationData { private DateTime _CollectionDate; private string _StationID; private ArrayList _PolledData; public StationData() { } public DateTime CollectionDate { get { return _CollectionDate; } set { _CollectionDate = value; } } public string StationID { get { return _StationID; } set { _StationID = value; } } [XmlInclude(typeof(DataPoints))] public ArrayList PolledData { get { return _PolledData; } set { _PolledData = value; } } } public class DataPoints { private string _SubStationID; private int _PointValue; public DataPoints { } public string SubStationID { get { return _SubStationID; } set { _SubStationID = value; } } public int PointValue { get { return _PointValue; } set { _PointValue = value; } } } 

我取得了以下成功:

 [XmlArray("HasTypeSpecialisations")] [XmlArrayItem("TypeObject", typeof(TypeObject), IsNullable = false)] public List TypeSpecialisations 

这导致:

     

在你的情况下,我会尝试类似的东西:

 [XmlArrayItem(typeof(DataPoints))] public ArrayList PolledData 

基于此链接http://msdn.microsoft.com/en-us/library/2baksw0z(VS.85).aspx你也应该能够使用这个

 [XmlElement(Type = typeof(DataPoints))] public ArrayList PolledData 

XmlSerializer在运行时生成一些代码来序列化您的类。 这个类必须知道可能发生的所有类型。

ArrayList不提供此信息,但您可以通过在返回ArrayList的属性上使用XmlInclude属性来提供此信息。

 [XmlInclude(typeof(DataPoints))] public ArrayList Points { ... } 

您还可以使用通用List <>类。

我认为你可以通过使用通用列表(List <>)而不是ArrayList来解决这个问题,但是,我会假设你不能出于某种原因使用泛型。

您需要告诉编译器ArrayList中包含哪些类型,因此它可以序列化它,因为它知道它包含对象。

将此添加到您的属性上方,它应该清除它。 [System.Xml.Serialization.XmlInclude(typeof运算(XMLSerialization.DataPoints))]

当然,将ArraySerialization.DataPoints替换为ArrayList中包含的任何类。

看一下这篇文章 ,它描述了你遇到的基本问题以及它周围的解决方案(比如使用XmlInclude属性)。 基本上说的是序列化程序遇到了一个它不知道如何序列化的类型。 如果您发布一些代码,它也会有很大帮助。

我总是用来序列化列表的方法是将它们转换为Arrays(具有必要的类型信息)。 我承认这有点脏,但如果你无法获得一个正确的序列化列表,这将有效。