Q
如何序列化字體
0
A
回答
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(此一賠GdiCharSet
和GdiVerticalFont
參數):
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);
}
}
相關問題
- 1. vb.net的字體序列化
- 2. 如何使這個實體序列化/反序列化?
- 3. 如何從Base64String反序列化上傳的字體?
- 4. 如何向實體的序列化JSON添加額外字段
- 5. 如何正確序列化和反序列化字典的值?
- 6. ServiceStack序列化字節[]。如何在JavaScript中反序列化?
- 7. XML序列化和反序列化 - 如何不給出具體的類型?
- 8. 如何反序列化JSON字符串?
- 9. 如何反序列化嵌套字典?
- 10. 如何序列化原始json字段?
- 11. 如何序列化GMP理性數字?
- 12. 如何序列化字典到base64
- 13. 如何序列化
- 14. 序列化POCO實體
- 15. Jackson - hibernate實體序列化
- 16. JPA實體,JSON序列化
- 17. 窗體序列化問題
- 18. 序列化對象本體
- 19. 序列化相關實體
- 20. StackOverflowException序列化.netTiers實體
- 21. 實體Fremework序列化
- 22. 序列化translateble實體
- 23. JMS序列化程序無法序列化實體與接口
- 24. 實體框架(實體類)序列化
- 25. 如何在窗體中編輯Rails序列化的散列?
- 26. 如何最佳序列化實體在C#中的列表
- 27. 字節序列化
- 28. 如何反序列化包含字典列表的字典
- 29. 序列化列表/字典
- 30. 序列化Nhibernate實體到json序列化過多
你XMLSerialising類? – pordi
可能重複:http://stackoverflow.com/questions/1940127/how-to-xmlserialize-system-drawing-font-class – pordi
而不是序列化整個Font類,你可能會序列化它的字體系列名稱+關鍵屬性像大小和大膽/斜體。 –