我正在使用DefaultValue
属性来实现正确的PropertyGrid
行为(它以粗体显示与默认值不同的值)。现在,如果我想使用 序列化显示的对象,则XmlSerializer
xml 文件中将没有具有默认值的属性的条目。
告诉 XmlSerializer 序列化这些的最简单方法是什么?
我需要它来支持“版本”,所以当我稍后在代码中更改默认值时 - 序列化属性获取它已经序列化的值,而不是“最新”的值。我可以考虑以下几点:
PropertyGrid
(使用自定义属性,因此将被忽略)的覆盖行为XmlSerializer
;- 做一些自定义的 xml 序列化,其中 ignore
DefaultValue
's; - 在将对象传递给之前对它做一些事情,
XmlSeriazer
这样它就不会再包含DefaultValue
's 了。
但是我有可能会错过一些秘密属性,它可以让我在没有太多痛苦的情况下做到这一点=D。
这是我想要的一个例子:
private bool _allowNegative = false;
/// <summary>
/// Get or set if negative results are allowed
/// </summary>
[Category(CategoryAnalyse)]
[Admin]
[TypeConverter(typeof(ConverterBoolOnOff))]
//[DefaultValue(false)] *1
public bool AllowNegative
{
get { return _allowNegative; }
set
{
_allowNegative = value;
ConfigBase.OnConfigChanged();
}
}
//public void ResetAllowNegative() { _allowNegative = false; } *2
//public bool ShouldSerializeAllowNegative() { return _allowNegative; } *3
//public bool ShouldSerializeAllowNegative() { return true; } *4
如果我取消注释 (*1),那么我将获得所需的效果PropertyGrid
- 具有默认值的属性以普通文本显示,否则文本为粗体。但是XmlSerializer
不会将具有默认值的属性放入 xml 文件中,这很糟糕(我正在尝试修复它)。
如果我取消注释 (*2) 和 (*3),那么它与取消注释 (*1) 完全一样。
如果我取消注释 (*2) 和 (*4),那么XmlSerializer
将始终将属性放入 xml 文件中,但这是因为它们不再具有默认值并PropertyGrid
以粗体文本显示所有值。