将c#中的嵌套列表序列化为XML

本文关键字:序列化 XML 列表 嵌套 | 更新日期: 2023-09-27 18:24:33

我在c#:List<List<OVReady.Types.PointF[]>>中有一个嵌套列表,需要将其序列化为xml

我的代码:

[XmlRoot("AlertInfo")]
public class AlertInfo
{
    [XmlElement("TargetID")]
    public string strTargetId { get; set; }
    [XmlElement("ChannelID")]
    public string strChId { get; set; }
    [XmlElement("Timestamp")]
    public string strTimestamp { get; set; }
    [XmlElement("Object")]
    public RectObject rfObject { get; set; }
    [XmlArray("Polygons")]
    [XmlArrayItem("Polygon")]
    public List<List<OVReady.Types.PointF[]>> lstPolygons { get; set; }
}
public class RectObject
{
    [XmlAttribute("x")]
    public float x { get; set; }
    [XmlAttribute("y")]
    public float y { get; set; }
    [XmlAttribute("width")]
    public float width { get; set; }
    [XmlAttribute("height")]
    public float height { get; set; }
}

我得到的:

<AlertInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <TargetID>730</TargetID>
  <ChannelID>613</ChannelID>
  <Timestamp>2014-09-26 19:56:07:5660</Timestamp>
  <Object x="0.24375" y="0.025" width="0.259375" height="0.9375001" />
  <Polygons>
    <Polygon>
      <ArrayOfPointF>
        <PointF>
          <X xmlns="http://www.objectvideo.com/schemas/ovready">0.30625</X>
          <Y xmlns="http://www.objectvideo.com/schemas/ovready">0.9375</Y>
        </PointF>
        <PointF>
          <X xmlns="http://www.objectvideo.com/schemas/ovready">0.696875</X>
          <Y xmlns="http://www.objectvideo.com/schemas/ovready">0.9416667</Y>
        </PointF>
      </ArrayOfPointF>
    </Polygon>
  </Polygons>
</AlertInfo>

我想要什么:

<AlertInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <TargetID>730</TargetID>
  <ChannelID>613</ChannelID>
  <Timestamp>2014-09-26 19:56:07:5660</Timestamp>
  <Object x="0.24375" y="0.025" width="0.259375" height="0.9375001" />
  <Polygons>
    <Polygon>
        <Point x=0.30625 y=0.9375>
        <Point x=0.696875 y=0.9416667>
      </Polygon>
  </Polygons>
</AlertInfo>

如何删除标记并根据需要设置位置x和y?

将c#中的嵌套列表序列化为XML

让我们从最简单的方法开始。将属性重新设计为更易于序列化。

为了能够做到这一点,我不得不引入一个新的类Polygon:

public class Polygon
{
    [XmlElement("Point")]
    public List<PointF> Points { get; set; }
}

然后你必须将你的房产重新设计为:

[XmlArray("Polygons")]
[XmlArrayItem("Polygon")]
public List<Polygon> lstPolygons { get; set; }

如果你没有像本例中那样奢侈地重新设计那处房产,下面你可以找到一个同样有效的破解方法。它不需要清洁,但它很有效,而且很简单。

其想法是XmlIgnore您的当前属性,以防止XML序列化程序处理它,然后使用一个仅为序列化设计的附加getter,该getter将使用LINQ动态重新格式化数据,使其为序列化程序做好准备。查看代码:

[XmlRoot("AlertInfo")]
public class AlertInfo
{
    [XmlElement("TargetID")]
    public string strTargetId { get; set; }
    [XmlElement("ChannelID")]
    public string strChId { get; set; }
    [XmlElement("Timestamp")]
    public string strTimestamp { get; set; }
    [XmlElement("Object")]
    public RectObject rfObject { get; set; }
    [XmlIgnore]
    public List<List<PointF[]>> lstPolygons { get; set; }
    [XmlArray("Polygons")]
    [XmlArrayItem("Polygon")]
    public List<Polygon> Polygons
    {
        get {
            return lstPolygons.Select(p => new Polygon() { Points = p.SelectMany(lp => lp).ToList() }).ToList();
        }
    }
}

序列化上述AlertInfo Polygons属性的结果是:

<Polygons>
  <Polygon>
    <Point x="0" y="0" />
    <Point x="0" y="0" />
  </Polygon>
</Polygons>

另一种方法是实现IXmlSerializable并自己控制序列化。查看这篇关于如何做到这一点的文章:

http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly

  1. 你嵌套得太多了,去掉嵌套最多的数组:

    public List<List<OVReady.Types.PointF[]>> lstPolygons { get; set; }
    

    public List<List<OVReady.Types.PointF>> lstPolygons { get; set; }
    
    • 如果可以修改OVReady.Types.PointF类,而不是将其修饰为将其属性正确序列化为属性而不是新元素
    • 如果没有,按照这个答案
相关文章: