2014-09-26 33 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