Сериализация/Десериализация списка объектов в XML - C#

Узнай цену своей работы

Формулировка задачи:

имеется базовый класс Figure
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Runtime.Serialization;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

namespace DCT
{
    [Serializable]
    [DataContract]
    [KnownType(typeof(Circle))]
    [System.Xml.Serialization.XmlInclude(typeof(Circle))]
    [XmlType]
    abstract public class Figure
    {
        public virtual void Draw(Graphics g)
        { }
        public string Name;
        public virtual void Move()
        { }
        [DataMember]
        protected bool state = true;
        [DataMember]
        protected float widthPen = 1;
        [DataMember]
 
        protected XmlColor clr;
 
        [DataMember]
        protected Point center;
        [DataMember]
        // [XmlAttribute("Center")]
        public XmlPoint Center
        {
            get
            {
                return center;
            }
            set { }
        }
        [XmlIgnore]
        [NonSerialized]
        protected Pen pen;
        public void InitializePen()
        {
            pen = new Pen(clr, widthPen);
        }
        public float WidthPen
        {
            get
            {
                return widthPen;
            }
            set
            {
                
                widthPen = value;
                InitializePen();
                pen.Width = widthPen;
            }
        }            
        public bool Running
        {
            get
            {
                return state;
            }
            set
            {
                state = value;
            }
        }
        public XmlColor ObjectColor
        {
            get
            {
                return clr;
            }
            set
            {
                clr = value;
            }
        }
        public string NameFigure()
        {
            return Name;
        }
        public string PositionX()
        {
            return null;
        }
        public string PositionY()
        {
            return null;
        }
    }
}
у него есть класс наследник Circle
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using Rnd;
using System.Runtime.Serialization;
using System.Xml.Serialization;
namespace DCT
{
    [Serializable]
    [XmlType]
    public class Circle : Figure
    {
        public Circle() {}
        public Circle(Size size, string Name)
        {
            this.Name = Name;
            maxSpeed = 5;
            minSpeed = -5;
            minDiameter = 10;
            maxDiameter = 35;
            indent = 35;
 
            Rnd.Haphazard hapz = new Rnd.Haphazard();
 
            clr = Color.FromArgb(hapz.redColor(),hapz.greenColor(),hapz.blueColor());
            pen = new Pen(clr, widthPen);
            canvaSize = size;
            dx = hapz.Speed(minSpeed, maxSpeed);
            dy = hapz.Speed(minSpeed, maxSpeed);
            recCircle = hapz.rect(canvaSize.Width - indent, canvaSize.Height - indent, minDiameter, maxDiameter);
            radius = recCircle.Width / 2;
            center.X = recCircle.X + radius;
            center.Y = recCircle.Y + radius;
        }
        [DataMember]
        [XmlAttribute("maxSpeed")]
        public int maxSpeed { set; get; }
        [DataMember]
        [XmlAttribute("minSpeed")]
        public int minSpeed { set; get; }
        [DataMember]
        [XmlAttribute("minDiameter")]
        public int minDiameter { set; get; }
        [DataMember]
        [XmlAttribute("maxDiameter")]
        public int maxDiameter { set; get; }
        [DataMember]
        [XmlAttribute("indent")]
        public int indent { set; get; }
        [DataMember]
        [XmlAttribute("radius")]
        public int radius { set; get; }
        [DataMember]
        public Size canvaSize { set; get; }
        [DataMember]
        [XmlAttribute("dx")]
        public int dx { set; get; }
        [DataMember]
        [XmlAttribute("dy")]
        public int dy { set; get; }
        [DataMember]
       
        public System.Drawing.Rectangle recCircle;
 
        public int GetRadius()
        {
            return radius;
        }
        public override void Draw(Graphics g)
        {
 
            g.DrawEllipse(pen, recCircle);
            g.DrawRectangle(pen, center.X, center.Y, 1, 1);
 
        }
        public override void Move()
        {
            if (state)
            {
                if (recCircle.X + recCircle.Width > canvaSize.Width)
                {
                    dx = -Math.Abs(dx);
                }
                if (recCircle.Y + recCircle.Height > canvaSize.Height)
                {
                    dy = -Math.Abs(dy);
                }
                if (recCircle.X < 0)
                {
                    dx = Math.Abs(dx);
                }
                if (recCircle.Y < 0)
                {
                    dy = Math.Abs(dy);
                }
                center.X += dx;
                center.Y += dy;
                recCircle.X += dx;
                recCircle.Y += dy;
            }
        } 
    }
}
Объект XmlColor - из статьи

Сериализация несереализируемого

:
по аналогии думаю переопределить другие структуры
 [Serializable]
    public struct XmlColor : System.Xml.Serialization.IXmlSerializable
    {
        private Color _color;
 
        public XmlColor(Color c)
        {
            _color = c;
        }
 
        public Color Color
        {
            get { return _color; }
        }
        public static implicit operator Color(XmlColor c)
        {
            return c.Color;
        }
 
        public static implicit operator XmlColor(Color c)
        {
            return new XmlColor(c);
        }
        System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema()
        {
            return null;
        }
 
        void IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
        {
            _color = ColorTranslator.FromHtml(reader.ReadString());
        }
        void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
        {
            writer.WriteString(ColorTranslator.ToHtml(this.Color));
        }
    }
Я создаю список объектов
List<Figure> lst;
lst.Add(new Circle(pictureBox1.Size, "Circle " + (++objCount).ToString()));
и так несколько различных объектов в рендомных местах. при сериализации использую такой код:
XmlSerializer writer = new XmlSerializer(typeof(List<Figure>));
                     FileStream sw = new FileStream(sfd.FileName, FileMode.Create, FileAccess.ReadWrite);
                     StreamWriter file = new StreamWriter(sw);
                     writer.Serialize(file, lst);
                     file.Close();
<ArrayOfFigure xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Figure xsi:type="Circle" maxSpeed="5" minSpeed="-5" minDiameter="10" maxDiameter="35" indent="35" radius="14" dx="1" dy="-1">
<Name>Circle 1</Name>
<Center>73,260</Center>
<WidthPen>1</WidthPen>
<Running>false</Running>
<ObjectColor>#AF03D3</ObjectColor>
<recCircle>
<Location>
<X>59</X>
<Y>246</Y>
</Location>
<Size>
<Width>29</Width>
<Height>29</Height>
</Size>
<X>59</X>
<Y>246</Y>
<Width>29</Width>
<Height>29</Height>
</recCircle>
<canvaSize>
<Width>656</Width>
<Height>348</Height>
</canvaSize>
</Figure>
<Figure xsi:type="Circle" maxSpeed="5" minSpeed="-5" minDiameter="10" maxDiameter="35" indent="35" radius="17" dx="2" dy="4">
<Name>Circle 2</Name>
<Center>94,300</Center>
<WidthPen>1</WidthPen>
<Running>false</Running>
<ObjectColor>#586262</ObjectColor>
<recCircle>
<Location>
<X>77</X>
<Y>283</Y>
</Location>
<Size>
<Width>34</Width>
<Height>34</Height>
</Size>
<X>77</X>
<Y>283</Y>
<Width>34</Width>
<Height>34</Height>
</recCircle>
<canvaSize>
<Width>656</Width>
<Height>348</Height>
</canvaSize>
</Figure>
</ArrayOfFigure>
ну вроде бы всё не плохо. а вот Десериализация... вот код
                    XmlSerializer serializer = new XmlSerializer(typeof(List<Figure>));
                    TextReader textReader = new StreamReader(ofd.FileName);
                    lst = (List<Figure>)serializer.Deserialize(textReader);
                    textReader.Close();
и возвращается в мой список всего 1 элемент. и я не могу понять в чем дело. подскажите в десериализации. p.s. уже реализована сериализация в *.bin и в формат *.json это обучающее приложение и это моя первая сериализация. вполне вероятного какой-то атрибут не дал. по-этому прошу подсказать или дать толковую стать по моей теме.

Решение задачи: «Сериализация/Десериализация списка объектов в XML»

textual
Листинг программы
static readonly XmlSerializer Serializer = new XmlSerializer(typeof(List<Figure>));
        public IEnumerable<Figure> Figures
        {
            get
            {
                try
                {
                    using (var fileStream = new FileStream(FileName, FileMode.Open))
                    {
                        return (IEnumerable<Figure>)Serializer.Deserialize(fileStream);
                    }
                }
                catch
                {
                    return Enumerable.Empty<Figure>();
                }
            }
        }
 
IEnumerable<Figure> fff = Figures;
                    lst.Clear();
                    lst = fff.ToList();

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.571 из 5
Похожие ответы