Сериализация/Десериализация списка объектов в 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();