2014-02-18 7 views
0

Я пытаюсь сериализовать список полигонов. Этот класс включает в себя 3 общедоступных поля: amountOfVertexes, List, где Stroke - это мой собственный класс и List, где 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 

И я добавляю те же элементы в Stroke

[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, потому что он закрыт. Что я делаю неправильно? Я пытаюсь сериализации ведьма помощи этого кода:

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

Большое спасибо! Я думаю, что это хороший опыт! Но это не было в сериализации Object Point! Проблема была в этом коде

 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); 

      } 
Смежные вопросы