ang*_*son 6 .net xml-serialization xmlignore
我是否正确理解.NET XmlIgnoreAttribute,它说:
指示XmlSerializer的Serialize方法不要序列化公共字段或公共读/写属性值.
那:
我问的原因是我用一个带有更多选项的新属性替换了文件中的属性.旧属性是一个简单的布尔属性,新属性是枚举.我已经更改了旧属性,以便将新属性的值转换为布尔值,根据旧属性在添加新属性之前的含义,get和set都已实现.
这允许我通过读取设置新属性的旧属性来静默升级新文件,并在序列化时添加新属性.
但是,我想从新的xml文件中删除旧属性,所以我想知道如果我用它标记它会发生什么[XmlIgnore],旧的xml文件是否仍然正确地反序列化并从文件中读取该属性,或者它会被完全忽略?
如果没有,以下变化会做我想要的吗?
[XmlAttribute("is-list")]
[DefaultValue(false)]
public bool IsList
{
get { return false; }
set {
if (value)
ListHandling = ListHandling.All;
}
}
Run Code Online (Sandbox Code Playgroud)
对于所有新对象,这将返回false,因为我已经指定了默认值,并且如果存在于旧文件中,并且设置为true,则会更改ListHandling属性,这将是重要的新属性.
编辑:经过测试,我已经确认这两种方法似乎都符合我的要求.我会留下这个问题,因为我仍然想知道上面提到的第一个行为是否只是一个实现细节,或者是否可以通过这种方式理解文档.
如果使用 标记属性XmlIgnore,则该属性将被忽略。当 XmlSerializer 构建其序列化程序集时,不考虑它。因此,反序列化期间不会填充 XmlIgnore-d 属性,并将保留其默认值。
示例程序(用于片段编译器):
public static void RunSnippet()
{
XmlSerializer ser = new XmlSerializer(typeof(Fie));
Fie f = (Fie)(ser.Deserialize(new StringReader("<Fie><Bob>Hello</Bob></Fie>")));
WL(f.Bob == null ? "null" : "something");
}
public class Fie
{
[XmlIgnore]
public string Bob { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
该程序的输出为null(如果从 Fie.Bob 中删除 XmlIgnore,则输出为something)。
编辑以响应您的编辑:这不仅仅是一个实现细节;这确实是该属性的记录行为。从文档的备注部分(第一段):“如果将 XmlIgnoreAttribute 应用于类的任何成员,则 XmlSerializer 在序列化或反序列化该类的实例时会忽略该成员。” (强调已添加)
| 归档时间: |
|
| 查看次数: |
6147 次 |
| 最近记录: |