我有以下课程:
[Serializable]
[XmlRoot ( ElementName = "TextData", IsNullable = false)]
public class TextData
{
private System.Drawing.Font fontColor;
[XmlAttribute ( AttributeName = "Font" )]
public System.Drawing.Font Font { get; set; }
[XmlAttribute ( AttributeName = "FontColor" )]
public System.Drawing.Color FontColor { get; set; }
[XmlAttribute ( AttributeName = "Text" )]
public string Text { get; set; }
public TextData ( )
{
} // End of TextData
} // End of TextData
我试图用以下代码保存它:
// Create our font dialog
FontDialog fontDialog = new FontDialog ( );
fontDialog.ShowColor = true;
// Display the dialog and check for an ok
if ( DialogResult.OK == fontDialog.ShowDialog ( ) )
{
// Save our changes for the font settings
if ( null == Properties.Settings.Default.MainHeadlineTextData )
{
Properties.Settings.Default.MainHeadlineTextData = new TextData ( );
}
Properties.Settings.Default.MainHeadlineTextData.Font = fontDialog.Font;
Properties.Settings.Default.MainHeadlineTextData.FontColor = fontDialog.Color;
Properties.Settings.Default.Save ( );
}
每次加载应用程序时,Properties.Settings.Default.MainHeadlineTextData仍然为null。保存似乎没有生效。我在另一篇文章中读到该课程必须是公开的。任何想法为什么这不能正常工作?
答案 0 :(得分:10)
它不起作用,因为Color和Font不是xml可序列化的。 更重要的是,Font没有无参数构造函数,因此 Settings.Save()无法序列化您的对象,也不会保存任何内容。
不幸的是,默认基础设施 SettingsBase (继承设置类) - 请参阅 Settings.Designer.cs中的自动生成代码 file)不会在序列化错误上抛出异常,因此您无法看到问题。
从班级中删除字体和颜色属性,然后重试。
另一种解决方案是使用二进制序列化。 打开 Settings.Designer.cs 文件,并将属性[SettingsSerializeAs(SettingsSerializeAs.Binary)]添加到属性 Settings.MainHeadlineTextData 。
答案 1 :(得分:2)
要将类保存到应用程序设置配置文件,该类必须支持TypeConverter或者是XMLSerializable。
您的代码没有为您的自定义类实现TypeConverter,并且Color和Font类不是XMLSerialiable。
如何实现类型转换器: http://msdn.microsoft.com/en-us/library/ayybcxe5%28VS.80%29.aspx
答案 2 :(得分:1)