【发布时间】:2021-05-15 23:14:39
【问题描述】:
我正在使用DefaultValue 属性来实现正确的PropertyGrid 行为(它以粗体显示与默认值不同的值)。现在,如果我想使用 XmlSerializer 序列化显示的对象,则 xml 文件中将没有默认值属性的条目。
告诉 XmlSerializer 序列化这些的最简单方法是什么?
我需要它来支持“版本”,所以当我稍后在代码中更改默认值时 - 序列化的属性会获取它已经序列化的值,而不是“最新的”。我可以考虑以下:
- 覆盖
PropertyGrid的行为(使用自定义属性,所以XmlSerializer会忽略它); - 做一些自定义的 xml 序列化,忽略
DefaultValue's; - 在将对象传递给
XmlSeriazer之前对它做一些事情,这样它就不会再包含DefaultValue了。
但是我有可能会错过一些秘密属性,它可以让我轻松地做到这一点 =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 将NOT 将具有默认值的属性放入 xml 文件中,这是 BAD(我正在尝试修复它)。
如果我取消注释 (*2) 和 (*3),那么它与取消注释 (*1) 完全一样。
如果我取消注释 (*2) 和 (*4),则 XmlSerializer 将始终将属性放入 xml 文件中,但这是因为它们不再具有默认值和 @987654333 @ 以粗体显示所有值。
【问题讨论】:
-
我还怀疑即使您将某个属性明确设置为默认值,XMLSerializer 仍然不会序列化数据,因为该值与默认值匹配。这意味着我认为您的解决方案将更像是一个自定义序列化程序。
-
@BradRem 也在思考这应该是正确的做法。遗憾的是,相同的属性被用于不同的目的(受到不同的威胁)而没有提前考虑。我宁愿写
[XmlDefaultValue(...)]和[PropertyGridDefaultValue(...)]。尽管编写更多属性很无聊,但最终用户可以选择他所需要的。
标签: c# winforms xml-serialization default-value