我想将对象序列化为二进制或xml。
我使用this method来序列化我的对象。但它给出了错误:System.Windows.Media.SolidColorBrush不可序列化。
我的对象包含Grid,Ellipse,SolidColorBrush对象。
如何序列化这些对象?
答案 0 :(得分:1)
您需要创建您自己的SerializableBrush
类,其中构造函数采用SolidBrush
等,并且还需要ToBrush
方法重建 GDI +画笔..
大多数其他GDI+
对象和结构(例如Color
,Pen
等也是如此,其中一些对象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文本)):
我希望这表明如何做到这一点;请注意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;
}
}