2014-02-18 95 views
0

我想序列化多邊形的列表。這個類包含3個公共字段:amountOfVertexes,列出哪裏Stroke - 是我自己的類,列出哪裏Point - 是C#類。非我不能序列化它,我錯了嗎? 這是我的課如何序列化點

[XmlRoot("CustomPolygon")] 
    public class CustomPolygon 
    { 
    #region Cunstructors 
    public CustomPolygon() 
    { 
    } 
    #endregion 

    #region Public fields 

    [XmlAttribute("amountOfVertexes")] 
    public int amountOfVertexes;     // Количество сторон полигона 
    [XmlArray("Points")] 
    [XmlArrayItem("Point")] 
    public List<Point> listOfVertexes;   // Список всех вершин 
    [XmlArray("Strokes")] 
    [XmlArrayItem("Stroke")] 
    public List<Stroke> listOfStrokes;    // Список ребер 
    #endregion 

    #region Private fields 
    private PointCollection Points; 
    #endregion 

我在中風

[XmlRoot("Stroke")] 
    public class Stroke 
    { 
    #region Constructors 
    public Stroke() 
    { 
     this.beginPoint = new Point(); 
     this.endPoint = new Point(); 
    } 
    public Stroke(Point pBegin, Point pEnd) 
    { 
     this.beginPoint = pBegin; 
     this.endPoint = pEnd; 
    } 
    #endregion 

    #region Public Member Variables 
    [XmlAttribute("beginPoint")] 
    public Point beginPoint;   // Начальная точка отрезка 
    [XmlAttribute("endPoint")] 
    public Point endPoint;    // Конечная точка отрезка 
    #endregion 
} 

添加相同的元素,但我不能添加相同的元素(我的意思是[XmlAttribute]),以Point類,因爲它關閉。我做錯了什麼?我想這個序列碼的whitch幫助:

using (StreamWriter writer = new StreamWriter(saveFileDialogPolygon.FileName)) 
{ 
XmlSerializer xmlSerializerCustom = new XmlSerializer(typeof (List <CustomPolygon>)); 
xmlSerializerCustom.Serialize(writer,listOfCustomPolygons); 
} 
writer.Close(); 

而且我得到了「發生錯誤,而反射式」可能是因爲點的錯誤?那麼,我如何序列化(和desirialze)標準的Point類呢?

+0

請註明的答案接受。如果問題是正確的解決方案,您可以接受自己的答案。 – Joel

回答

0

我以前有類似的問題,請看: Build a Custom Serialization as String in System.Xml.Serialization

我的解決方法適合您的情況是這樣的:

[XmlIgnore] 
    public List<Point> listOfVertexes; 

    [XmlArray("Points")] 
    [XmlArrayItem("Point")] 
    public string[] listOfVertexesString 
    { 
     get { return listOfVertexes.Select(s => s.X + "," + s.Y).ToArray(); } 
     set 
     { 
      listOfVertexes = value 
       .Select(s => new Point 
       { 
        X = int.Parse(s.Split(',')[0]), 
        Y = int.Parse(s.Split(',')[1]) 
       }) 
       .ToList(); 
     } 
    } 

這將產生一個像這樣的XML:

<!-- something before --> 
    <Points> 
     <Point>0,1</Point> 
     <Point>4,10</Point> 
     <Point>3,5</Point> 
    </Points> 
    <!-- something after --> 
0

非常感謝您!我認爲這是很好的體驗!但是這個問題不在對象點序列化中!問題是在這個代碼

 using (StreamReader reader = new StreamReader(openFileDialog.FileName)) 
       { 
        // Найдем количество полигонов в Xml-файле 
        XmlDocument loadedXml = new XmlDocument(); 
        string directory = openFileDialog.FileName; 
        loadedXml.Load(reader); **// I USE IT, BUT NO CLOSE!** 
        XmlNodeList polygonNodeList = loadedXml.GetElementsByTagName("CustomPolygon"); 

       if (polygonNodeList.Count > 1) 
        for (int i = 0; i < polygonNodeList.Count; i++) 
        { 
         // List <CustomPolygon> listcp= new List<CustomPolygon>(); 
      XmlSerializer xmlReader = new XmlSerializer(typeof (List<CustomPolygon>)); 
       var listcp = (List<CustomPolygon>)xmlReader.Deserialize(reader); 
         } 
       else 
        { 
         XmlSerializer xmlReaderResult = new XmlSerializer((typeof (CustomPolygon))); 
         CustomPolygon loadedResultPolygon = (CustomPolygon) xmlReaderResult.Deserialize(reader); **// MORE OVER I USE IT IN THIS PLACE, WITHOUT CLOSE()** BEFORE 
         resultOfTwoPolygonsUnion = loadedResultPolygon; 
        } 
        reader.Close(); 
       } 
0

取而代之的是,我應該使用這樣的:

  StreamReader file=new StreamReader(openFileDialog.FileName); 
      // Найдем количество полигонов в Xml-файле 
      XmlDocument loadedXml = new XmlDocument(); 
      loadedXml.Load(file); 
      XmlNodeList polygonNodeList = loadedXml.GetElementsByTagName("CustomPolygon"); 
      file.Close(); 

      using (StreamReader reader = new StreamReader(openFileDialog.FileName)) 
      { 

       XmlSerializer xmlReader = new XmlSerializer(typeof(CustomPolygon)); 
       CustomPolygon resultPolygon = new CustomPolygon(); 
       resultPolygon = (CustomPolygon)xmlReader.Deserialize(reader); 

      }