如何有效地保留 .Net 字体对象?

Posted

技术标签:

【中文标题】如何有效地保留 .Net 字体对象?【英文标题】:How do I effectively persist a .Net font object? 【发布时间】:2010-09-12 05:37:55 【问题描述】:

用例:用户对设计表面上的对象进行字体自定义,我需要将其加载/保存到我的数据存储区。 IE。粗体、斜体、大小、字体名称等设置需要保留。

是否有一些简单(可靠)的机制可以从字体对象的字符串表示形式转换/读回(在这种情况下,我只需要一个属性)?还是多个属性与自定义逻辑相结合是正确的选择?

【问题讨论】:

【参考方案1】:

使用TypeConverter:

Font font = new Font("Arial", 12, GraphicsUnit.Pixel);

TypeConverter converter = TypeDescriptor.GetConverter(typeof (Font));

string fontStr = converter.ConvertToInvariantString(font);

Font font2 = (Font) converter.ConvertFromString(fontStr);

Console.WriteLine(font.Name == font2.Name); // prints True

如果你想使用 XML 序列化,你可以创建 Font 类包装器,它会存储一些 Font 属性的子集。

注意(Gishu) - 永远不要直接访问类型转换器。相反,请使用 TypeDescriptor 访问相应的转换器。非常重要:)

【讨论】:

太棒了!.. 像广告宣传的那样工作 - 谢谢 aku。投票给你更接近 5K 标记:) 我认为ConvertFromInvariantString() 应该用作ConvertToInvariantString() 的对应物(而不是上面示例中的ConvertFromString())。【参考方案2】:

您需要将它保存在什么类型的数据存储中?如果只是可以保存在文件中的用户设置,您可以将字体对象序列化为二进制或 xml 格式的设置文件(如果您希望能够直接编辑配置文件)。序列化命名空间(System.Xml.Serialization 和 System.Runtime.Serialization)提供了执行此操作的所有工具,而无需编写自定义代码。

关于 XML 序列化的 MSDN 站点:XML Serialization in the .Net Framework

[编辑]所以显然字体对象是不可序列化的。哎呀:(对不起。

【讨论】:

字体对象不可序列化。【参考方案3】:

在我正在进行的项目中,我使用了多个属性。

我通过分解字体的名称、大小、样式和单位将字体保存到数据库表中,然后保留这些值。

一旦检索到这些值,就可以按需重新创建字体。

【讨论】:

以上是关于如何有效地保留 .Net 字体对象?的主要内容,如果未能解决你的问题,请参考以下文章

Java 如何有效地避免OOM:善于利用软引用和弱引用

如何使 .NET DLL 中的属性对 COM 可见(方法有效)

ASP.NET——如何在不过度设计的情况下有效地使用设计模式!

如何在 Blender 中有效地更改多个对象的相同参数?

如何使用 sqlalchemy 有效地管理频繁的模式更改?

如何有效地漂亮打印 JSON 对象列表? [复制]