【问题标题】:Serializing an arraylist in C#在 C# 中序列化数组列表
【发布时间】:2009-03-20 08:00:25
【问题描述】:

我有一个包含许多标准字段和一个数组列表的类。

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

到目前为止的尝试会导致一条错误消息:

未处理的异常: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; }
  }
}

【问题讨论】:

  • 能否包含您的类声明代码和您的 XmlSerialization 代码?

标签: c#


【解决方案1】:

我在以下方面取得了成功:

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

这会导致:

<HasTypeSpecialisations>
    <TypeObject />
    <TypeObject />
</HasTypeSpecialisations>

在你的情况下,我会尝试这样的事情:

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

基于此链接http://msdn.microsoft.com/en-us/library/2baksw0z(VS.85).aspx,您应该也可以使用它

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

【讨论】:

    【解决方案2】:

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

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

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

    您也可以使用通用 List 类。

    【讨论】:

    • 现在出现编译时错误:属性“XmlInclude”在此声明类型上无效。它仅对“类、结构、方法、接口”声明有效
    【解决方案3】:

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

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

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

    当然,用 ArrayList 中包含的任何类替换 XMLSerialization.DataPoints。

    【讨论】:

    • 我已经发布了一些代码摘录,因为编译器现在抱怨 XmlInclude 语句(在此声明类型上无效)。我会看看 ArrayList 是否可以替换为 List.
    【解决方案4】:

    查看this article,它描述了您遇到的基本问题和解决方案(例如使用 XmlInclude 属性)。基本上说的是序列化程序遇到了一种它不知道如何序列化的类型。如果您发布一些代码,它也会有很大帮助。

    【讨论】:

      【解决方案5】:

      我一直用来序列化列表的方法是将它们转换为数组(它具有必要的类型信息)。我承认这有点脏,但如果你不能得到一个合适的列表来序列化,这会起作用。

      【讨论】:

        猜你喜欢
        • 2013-02-13
        • 2011-10-19
        • 1970-01-01
        • 1970-01-01
        • 2018-09-23
        • 2019-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多