Сериализация/Десериализация списка объектов в XML - C#
Формулировка задачи:
имеется базовый класс Figure
у него есть класс наследник Circle
Объект XmlColor - из статьи
Я создаю список объектов
и так несколько различных объектов в рендомных местах.
при сериализации использую такой код:
ну вроде бы всё не плохо.
а вот Десериализация...
вот код
и возвращается в мой список всего 1 элемент.
и я не могу понять в чем дело.
подскажите в десериализации.
p.s. уже реализована сериализация в *.bin и в формат *.json
это обучающее приложение и это моя первая сериализация. вполне вероятного какой-то атрибут не дал. по-этому прошу подсказать или дать толковую стать по моей теме.
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; } } }
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; } } } }
Сериализация несереализируемого
:
по аналогии думаю переопределить другие структуры
[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();
Решение задачи: «Сериализация/Десериализация списка объектов в 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();
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д