序列化媒体和形状对象

时间:2016-10-19 04:42:22

标签: c# serialization

我想将对象序列化为二进制或xml。

我使用this method来序列化我的对象。但它给出了错误:System.Windows.Media.SolidColorBrush不可序列化。

我的对象包含Grid,Ellipse,SolidColorBrush对象。

如何序列化这些对象?

1 个答案:

答案 0 :(得分:1)

您需要创建您自己的SerializableBrush类,其中构造函数采用SolidBrush等,并且还需要ToBrush方法重建 GDI +画笔..

大多数其他GDI+对象和结构(例如ColorPen等也是如此,其中一些对象Color甚至需要SerializableBrush } .. class ..

[Serializable]属性装饰它! 一个简单的可序列化Color类:

[Serializable]
public class SerColor
{
    public byte Red { get; set; }
    public byte Green { get; set; }
    public byte Blue { get; set; }
    public byte Alpha { get; set; }

    public SerColor() { }

    public SerColor(Color c)
    { Red = c.R;  Green = c.G; Blue = c.B; Alpha = c.A; }

    static public Color Color(SerColor c)
    { return System.Drawing.Color.FromArgb(c.Alpha, c.Red, c.Green, c.Blue); }

}

'一个简单的可序列化SolidBrush类:

[Serializable]
public class SerSolidBrush 
{
    public SerColor sColor { get; set; }

    public SerSolidBrush() { }

    public SerSolidBrush(Color c)
    {
        sColor = new SerColor(c);
    }

    public SerSolidBrush(SolidBrush b)
    {
        sColor = new SerColor(b.Color);
    }


    public SolidBrush SolidBrush()
    {
        Color c = SerColor.Color(sColor);
        return new System.Drawing.SolidBrush(c);
    }

    static public SolidBrush SolidBrush(SerSolidBrush b)
    {
        Color c = SerColor.Color(b.sColor);
        return new System.Drawing.SolidBrush(c);
    }
}

一个小试验台:

SolidBrush brush = new SolidBrush(Color.Red);

SerSolidBrush sBrush = new SerSolidBrush(brush);

XmlSerializer xs = new XmlSerializer(sBrush.GetType());
using (TextWriter tw = new StreamWriter(@"d:\xmlBrush.xml"))
{

    xs.Serialize(tw, sBrush);
    tw.Close();
}
SerSolidBrush sBrush2 = null;
using (TextReader tr = new StreamReader(@"d:\xmlBrush.xml"))
    sBrush2 = (SerSolidBrush) xs.Deserialize(tr);

SolidBrush newBrush = sBrush2.SolidBrush();

这是生成的xml文件((没有想法如何正确地在SO回答中插入xml文本)):

enter image description here

我希望这表明如何做到这一点;请注意SolidBrush是一个非常简单的类,只有一个属性。如果您想支持所有属性,Pen和其他大多数会更复杂。

请注意,简单的内置枚举(如LineJoin等)是可序列化的,因此您可以简单地添加这些功能,一切正常。在这里展示一个相当不完整的可归属Pen类。您将需要添加其他几个属性..:

[Serializable]
public class SerPen 
{
    public SerColor sColor { get; set; }
    public float width { get; set; }
    public LineJoin lineJoin  { get; set; }

    // constructors
    public SerPen() { width = 1f; }

    public SerPen(Color c, float w)
    {
        sColor = new SerColor(c);
        width = w;
    }

    public SerPen(Pen p)
    {
        sColor = new SerColor(p.Color);
        width = p.Width;
        lineJoin = p.LineJoin;
    }

    // re-constructors
    public Pen  Pen ()
    {
        Color c = SerColor.Color(sColor);
        Pen pen = new System.Drawing.Pen (c, width);
        pen.LineJoin = lineJoin;
        return pen;
    }

    static public Pen  Pen (SerPen p)
    {
        Color c = SerColor.Color(p.sColor);
        Pen pen = new System.Drawing.Pen (c, p.width);
        pen.LineJoin = p.lineJoin;
        return pen;
    }
}