将类序列化为 XML 将保留为空值

本文关键字:空值 保留 XML 序列化 | 更新日期: 2023-09-27 18:36:04

很难解释,有人能发现问题所在吗?

我正在将一个类序列化为 XML,但其中一个属性(类中的公共类)在 XML 中被赋予了空白值。

我正在

创建自己的设置类,我正在将其序列化为 XML 并反序列化回应用程序的类加载。

我已经将调试点放入 Save 方法中,"配色方案"确实有值,但它们在 XML 中被空白。

public class SettingsModel
{
    // DECLARE: Settings File Location
    private static string SettingsFilePath = String.Format(@"{0}'{1}'{2}", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Typhoeus BluePrint", "BluePrint_Settings.xml");
    // DECLARE: Public Settings
    public DateTime LastUpdated = System.DateTime.Now;
    public string StylesheetName = "style.css";
    public string WebPageName = "index.html";
    public string ProjectDirectory = String.Format(@"{0}'{1}'{2}", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Typhoeus BluePrint", "Projects");
    public ColourSchemeClass ColourScheme = new ColourSchemeClass();
    public SettingsModel()
    {
    }
    public void Save()
    {
        LastUpdated = System.DateTime.Now;
        // DECLARE: File Stream Object
        FileStream fs = new FileStream(SettingsFilePath, FileMode.OpenOrCreate);
        // DECLARE: Serialisation Parameters
        XmlSerializer ClassSerialiser = new XmlSerializer(typeof(SettingsModel));
        // SERIALISE: This Class to XML
        ClassSerialiser.Serialize(fs, this);
        // CLOSE: File Stream
        fs.Close();
    }
}

这是配色方案类

public class ColourSchemeClass
{
    #region Objects
    // DECLARE: Colour Scheme Properties
    public Color BaseColour = ColorTranslator.FromHtml("#1E1E1E");
    public Color HighlightColour = ColorTranslator.FromHtml("#414141");
    public Color SelectedColour = Color.White;
    #endregion
    #region Constructors
    public ColourSchemeClass()
    {
    }
    public ColourSchemeClass (Color Base, Color Highlight, Color Selected)
    {
        BaseColour = Base;
        HighlightColour = Highlight;
        SelectedColour = Selected;
    }
    #endregion
}

这是序列化后的 XML。(摘录,因为我似乎无法在此处格式化)(用方括号替换了标签打开和关闭)

[ColourScheme]
[BaseColour/]
[HighlightColour/]
[SelectedColour/]
[/ColourScheme]

将类序列化为 XML 将保留为空值

Color是不

可变的(没有setters),因此不能由XmlSerializer有效地序列化。 您需要为每个颜色属性引入一个代理属性,例如:

    [XmlIgnore]
    public Color BaseColour { get; set; }
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    [XmlElement("BaseColour")]
    public string XmlBaseColour
    {
        get
        {
            return ColorTranslator.ToHtml(BaseColour);
        }
        set
        {
            BaseColour = ColorTranslator.FromHtml(value);
        }
    }