C#自定义用户设置类未保存

Kyl*_*yle 5 c# settings

我有以下课程:

[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
Run Code Online (Sandbox Code Playgroud)

我试图用以下代码保存它:

    // 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 ( );
    }
Run Code Online (Sandbox Code Playgroud)

每次加载应用程序时,Properties.Settings.Default.MainHeadlineTextData仍为null.保存似乎没有生效.我在另一篇文章中读到该课程必须是公开的.任何想法为什么这将无法正常工作?

Kon*_*rin 10

它不起作用,因为颜色和字体不是xml可序列化的.更重要的是,Font没有无参数构造函数,因此Settings.Save()无法序列化您的对象,也不会保存任何内容.

不幸的是,默认情况下,类SettingsBase下的基础结构(继承您的Settings类 - 请参阅Settings.Designer.cs文件中的自动生成的代码)不会在序列化错误上引发异常,因此您无法看到问题.

从班级中删除字体和颜色属性,然后重试.

另一种方法

另一种解决方案是使用二进制序列化.打开Settings.Designer.cs文件,将属性[SettingsSerializeAs(SettingsSerializeAs.Binary)]添加到属性Settings.MainHeadlineTextData.