2014-09-26 32 views
0

我有一个嵌套列表在C#:List<List<OVReady.Types.PointF[]>>,它必须是序列化到XML在C#中序列化一个嵌套列表,以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> 

^h我可以移除标签,并根据需要设置位置x和y吗?

+0

您需要实现'Serialize'和你的'AlertInfo'类'Deserialize'方法来实现这一 – 2014-09-26 12:12:43

+0

您可以实现'IXmlSerializable'和处理序列和'ReadXml'和'WriteXml'方法中的反序列化。 – juharr 2014-09-26 12:13:50

+0

Juharr的好处。我不认为你只能通过属性来处理它。为了实现IXmlSerializable正确检出:http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly – 2014-09-26 12:16:01

回答

0
  1. 你嵌套了,除去最嵌套的数组:

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

    public List<List<OVReady.Types.PointF>> lstPolygons { get; set; } 
    
    • ,如果你可以修改OVReady.Types.PointF类比装点正确地将其属性序列化为属性而不是新元素
    • 如果没有,请遵循以下answer
0

让我们开始与可能的最简单的方法。重新设计你的财产更容易序列化。

为了能够做到这一点,我已经向大家介绍一类新的多边形:

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

然后,你就必须重新设计你的财产是:

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

如果你不这样做有像这个例子那样重新设计财产的奢侈品,下面你可以找到一个可以工作的黑客。它不是清洁,但它的工作原理很简单。

这个想法是XmlIgnore您当前的属性,以防止XML序列化程序处理它,然后使用一个额外的只用于序列化的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> 
    <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