2013-10-09 53 views
0

我有一個類,我設置[Serializable]屬性爲該類。如何序列化字體

在這個類

我確定當我試圖序列它給我像「system.drawing.font不能序列」

+0

你XMLSerialising類? – pordi

+2

可能重複:http://stackoverflow.com/questions/1940127/how-to-xmlserialize-system-drawing-font-class – pordi

+0

而不是序列化整個Font類,你可能會序列化它的字體系列名稱+關鍵屬性像大小和大膽/斜體。 –

回答

2

你不能序列化字體的錯誤一個字體類member.but。你不能序列化大多數GDI資源。

您可以嘗試使用FontConverter類將其序列化爲字符串。

4

我做這在最近的一個項目:

[XmlIgnore()] 
public Font Font { 
    get { return mFont; } 
    set { mFont = value; } 
} 

[Browsable(false)] 
public string FontHidden { 
    get { return FontSerializationHelper.Serialize(mFont); } 
    set { mFont = FontSerializationHelper.Deserialize(value); } 
} 

的FontSerializationHelper類如下:

using System.Windows.Forms; 
using System.ComponentModel; 
using System.ComponentModel.Design.Serialization; 
using System.Text.RegularExpressions; 
using System.Xml.Serialization; 

[TypeConverter(typeof(FontConverter))] 
internal class FontSerializationHelper 
{ 
    public static Font Deserialize(string value) 
    { 
     object m = Regex.Match(value, "^(?<Font>[\\w ]+),(?<Size>(\\d+(\\.\\d+)?))(,(?<Style>(R|[BIU]{1,3})))?$", RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase); 

     if (m.Success) 
     { 
      if (m.Groups.Count < 4 || m.Groups(3).Value == "R") 
      { 
       return new Font(m.Groups("Font").Value, Single.Parse(m.Groups("Size").Value)); 
      } 
      else 
      { 
       object fs = m.Groups(3).Value.IndexOf("B") >= 0 ? FontStyle.Bold : FontStyle.Regular | m.Groups(3).Value.IndexOf("I") >= 0 ? FontStyle.Italic : FontStyle.Regular | m.Groups(3).Value.IndexOf("U") >= 0 ? FontStyle.Underline : FontStyle.Regular; 
       return new Font(m.Groups("Font").Value, Single.Parse(m.Groups("Size").Value), fs); 
      } 
     } 
     else 
     { 
      throw new FormatException("Value is not properly formatted."); 
     } 
    } 

    public static string Serialize(Font value) 
    { 
     string str; 

     str = value.Name + "," + value.Size.ToString() + ","; 
     if (value.Style == FontStyle.Regular) 
     { 
      str += "R"; 
     } 
     else 
     { 
      if (value.Bold) str += "B"; 
      if (value.Italic) str += "I"; 
      if (value.Underline) str += "U"; 
     } 

     return str; 
    } 
} 

請注意,我只是保存字體,大小和樣式信息。您可能想要添加更多內容。

2

即使這個問題是舊的,這裏是我的解決方案:

解決方案#1(此一賠GdiCharSetGdiVerticalFont參數):

private Font font = new Font("Arial", 13f, FontStyle.Regular, GraphicsUnit.Pixel, 0, false); 

[XmlIgnore()] 
public Font Font { 
    get { return font; } 
    set { font = value; } 
} 

[Browsable(false)] 
public string FontSerialize { 
    get { return TypeDescriptor.GetConverter(typeof(Font)).ConvertToInvariantString(font); } 
    set { font = TypeDescriptor.GetConverter(typeof(Font)).ConvertFromInvariantString(value) as Font; } 
} 

解決方案2(利用全部Font構造參數):

屬性:

[XmlIgnore()] 
public Font Font { 
    get { return font; } 
    set { font = value; } 
} 

[Browsable(false)] 
public string FontSerialize { 
    get { return FontSerializationHelper.ToString(font); } 
    set { font = FontSerializationHelper.FromString(value); } 
} 

FontSerializationHelper類:

[TypeConverter(typeof(FontConverter))] 
static public class FontSerializationHelper { 

    static public Font FromString(string value) { 
     var parts = value.Split(':'); 
     return new Font(
      parts[0],             // FontFamily.Name 
      float.Parse(parts[1]),          // Size 
      EnumSerializationHelper.FromString<FontStyle>(parts[2]), // Style 
      EnumSerializationHelper.FromString<GraphicsUnit>(parts[3]), // Unit 
      byte.Parse(parts[4]),          // GdiCharSet 
      bool.Parse(parts[5])          // GdiVerticalFont 
     ); 
    } 

    static public string ToString(Font font) { 
     return font.FontFamily.Name 
       + ":" + font.Size 
       + ":" + font.Style 
       + ":" + font.Unit 
       + ":" + font.GdiCharSet 
       + ":" + font.GdiVerticalFont 
       ; 
    } 
} 

EnumSerializationHelper類:

[TypeConverter(typeof(EnumConverter))] 
static public class EnumSerializationHelper { 

    static public T FromString<T>(string value) { 
     return (T)Enum.Parse(typeof(T), value, true); 
    } 
}