Ron*_*nny 11 .net c# serialization
该类System.Drawing.Font不是XML Serializable,因为它没有默认(空)构造函数.
是否有一些工作或其他方式序列化Font?
Ela*_*lad 19
编辑:我根据Regent建议使用更新代码FontConverter,同时保留使用SerializableFont常规的能力Font.
public class SerializableFont
{
public SerializableFont()
{
FontValue = null;
}
public SerializableFont(Font font)
{
FontValue = font;
}
[XmlIgnore]
public Font FontValue { get; set; }
[XmlElement("FontValue")]
public string SerializeFontAttribute
{
get
{
return FontXmlConverter.ConvertToString(FontValue);
}
set
{
FontValue = FontXmlConverter.ConvertToFont(value);
}
}
public static implicit operator Font(SerializableFont serializeableFont)
{
if (serializeableFont == null )
return null;
return serializeableFont.FontValue;
}
public static implicit operator SerializableFont(Font font)
{
return new SerializableFont(font);
}
}
public static class FontXmlConverter
{
public static string ConvertToString(Font font)
{
try
{
if (font != null)
{
TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
return converter.ConvertToString(font);
}
else
return null;
}
catch { System.Diagnostics.Debug.WriteLine("Unable to convert"); }
return null;
}
public static Font ConvertToFont(string fontString)
{
try
{
TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
return (Font)converter.ConvertFromString(fontString);
}
catch { System.Diagnostics.Debug.WriteLine("Unable to convert"); }
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
用法:拥有Font属性时,将其声明为SerializableFont.这将允许它被序列化,而隐式转换将为您处理转换.
而不是写:
Font MyFont {get;set;}
Run Code Online (Sandbox Code Playgroud)
写:
SerializableFont MyFont {get;set;}
Run Code Online (Sandbox Code Playgroud)
我使用可序列化的字体,与Elad 的.
在我的可序列化数据实体中,我隐藏 ( [XmlIgnore]) 具有Font类型的属性并公开具有SerializableFont类型的属性,该类型被序列化程序“吃掉”。
请注意,这仅适用于XmlSerializer。
/// <summary>
/// Font descriptor, that can be xml-serialized
/// </summary>
public class SerializableFont
{
public string FontFamily { get; set; }
public GraphicsUnit GraphicsUnit { get; set; }
public float Size { get; set; }
public FontStyle Style { get; set; }
/// <summary>
/// Intended for xml serialization purposes only
/// </summary>
private SerializableFont() { }
public SerializableFont(Font f)
{
FontFamily = f.FontFamily.Name;
GraphicsUnit = f.Unit;
Size = f.Size;
Style = f.Style;
}
public static SerializableFont FromFont(Font f)
{
return new SerializableFont(f);
}
public Font ToFont()
{
return new Font(FontFamily, Size, Style,
GraphicsUnit);
}
}
Run Code Online (Sandbox Code Playgroud)