将类序列化为 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]
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);
}
}