c# - 如何 XmlSerialize System.Drawing.Font 类

标签 c# .net serialization

System.Drawing.Font 类不是 XML 可序列化的,因为它没有默认(空)构造函数。
尽管如此,是否有一些解决方法或替代方法来序列化 Font

最佳答案

编辑:我根据 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;
    }
}

用法:当您有一个Font 属性时,将其声明为SerializableFont。这将允许它被序列化,而隐式转换将为您处理转换。

而不是写:

Font MyFont {get;set;}

写:

SerializableFont MyFont {get;set;}

关于c# - 如何 XmlSerialize System.Drawing.Font 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1940127/

相关文章:

c# - 无限系列 : While loop ends in infinity

C# - 类似 Google 的查询引擎。-

c# - 如何添加对 Microsoft.VisualBasic.dll 的引用?

c# - 在紧凑型和完整 .net 框架之间切换编译?

使用 DatagramChannels 和序列化时的 Java NIO BufferUnderflowException

java - 为什么不将类序列化的定义放在共享包中会导致 `ClassNotFoundException` ?

c++ - 序列化 boost 变体;非常奇怪和迟钝的编译器错误(MSVC 2010)

c# - 相当于 struct.unpack ("21"、 logfile.read(8)) 的 C# 是什么?

c# - 如何使用 C# XML 序列化序列化 xml 数组和类属性

c# - 使函数在 Linq 函数中被调用