【问题标题】:Serialize Media and Shapes objects序列化媒体和形状对象
【发布时间】:2016-10-19 04:42:22
【问题描述】:

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

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

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

如何序列化这些对象?

【问题讨论】:

  • 您需要创建一个 SerializableBrush 类,该类具有采用 SolidBrush 等的构造函数以及一个 ToBrush 方法来重建 GDI+ 画笔..

标签: c# serialization


【解决方案1】:

您需要创建一个您自己的SerializableBrush 类,该类具有采用SolidBrush 等的构造函数以及一个ToBrush 方法来重建 GDI+ 画笔。 .

对于大多数其他 GDI+ 对象和结构(如 ColorPen 等)也是如此,其中一些,如 Color,您甚至需要 SerializableBrush 类。

[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 文本)):

我希望这说明了如何做到这一点;请注意,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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-14
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多