Xmlignoreattribute,仅在序列化过程中使用,而不是在避难所化时?
-
23-09-2019 - |
题
我理解.net的正确吗 xmlignoreattribute, ,说:
指示XMLSerializer的序列化方法不要序列化公共字段或公共读/写属性值。
那:
- 如果存在于XML文件中,则该属性将被应对?
- 该属性不会序列化到新的XML文件?
我要问的是,我已经用一个具有更多选项的新属性替换了文件中的属性。古老的物业是一个简单的布尔属性,而新物业是枚举。我已经更改了旧属性,以便根据旧属性在添加新的属性之前的含义,将新属性的价值转换为布尔值。
这使我能够通过阅读旧属性(设置新属性)并在序列化时静静地升级新文件,并添加了新属性。
但是,我想从新的XML文件中删除旧属性,所以我想知道如果我标记了它会发生什么 [XmlIgnore]
, ,旧的XML文件是否仍然可以正确地进行审理并从文件中读取该属性,还是会完全忽略它?
如果没有,以下更改会做我想要的吗?
[XmlAttribute("is-list")]
[DefaultValue(false)]
public bool IsList
{
get { return false; }
set {
if (value)
ListHandling = ListHandling.All;
}
}
这将返回所有新对象的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; }
}
该程序的输出是 null
(如果您从fie.bob中删除xmlignore,则输出为 something
).
响应您的编辑: 这不仅是实施细节;确实是属性的记录行为。从评论部分 文档 (第一段):“如果您将XMlignoreAttribute应用于类的任何成员,则XMLSerialializer在序列化时会忽略该成员 或应得的 班级的实例。”(添加了强调)