如何XmlSerialize System.Drawing.Font类

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)

  • 严格来说,你最终得到了一些xml,但实际上你已经通过将其二进制内容转储到base64编码的文本元素中来消除了xml的所有语义丰富性.恕我直言这个词的有用意义上并非"xml序列化".它不像你可以"看到"xml中的任何Font属性,而不首先反序列化,也不能XPath,转换它,迭代它等等 (6认同)

Max*_*kin 5

我使用可序列化的字体,与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)