我有一个对象,我正在尝试序列化,输出看起来像这样:
<root>
<Items>
<Item>
<Value> blabla </Value>
</Item>
</Items>
其中Item是类root使用的类。
[Serializable]
[XmlType("root")]
public class Root { }
[Serializable]
[XmlInclude(typeof(Item))]
public class Items {}
[Serializable]
public class Item
{
[XmlElement("Value")]
public string DefaultValue { get; set; }
}
在某些情况下,我想忽略值的值,我有这个代码
var overrides = new XmlAttributeOverrides();
var attributes = new XmlAttributes { XmlIgnore = true };
attributes.XmlElements.Add(new XmlElementAttribute("Item"));
overrides.Add(typeof(Item), "Value", attributes);
var serializer = new XmlSerializer(typeof(root), overrides);
但该值仍写在输出中。
我做错了什么?
答案 0 :(得分:3)
如果始终忽略值,则最好直接将属性分配给成员。
[Serializable]
[XmlInclude(typeof(Item))]
public class Items
{
[XmlIgnore]
public string Value
}
如果有条件地忽略了值,我怀疑你最好在序列化之前从根类中删除元素。
至于你的代码,我怀疑(我可能错了,因为我还没有尝试过!)以下就足够了:
var overrides = new XmlAttributeOverrides();
var attributes = new XmlAttributes { XmlIgnore = true };
overrides.Add(typeof(Items), "Value", attributes);
serializer = new XmlSerializer(typeof(root), overrides);
更新:我测试了上面的代码。有用。 :d
再次更新:它应该是Items
而不是Item
,因为Value
位于Items
。或者,如果您喜欢其他方式,那么Value
和Item
中的Item
可能一直都是{。}}。
答案 1 :(得分:2)
现在您已经更新了问题,很明显您做错了什么。 :)
[Serializable]
public class Item
{
[XmlElement("Value")]
public string DefaultValue { get; set; }
}
您应该按照指定in the documentation传递属性的名称而不是xml名称。
overrides.Add(typeof(Item), "DefaultValue", attributes);
......而不是......
overrides.Add(typeof(Item), "Value", attributes);
同样在Fun Mun Pieng的回答中指出,你不应该再添加XmlElementAttribute,所以删除以下行:
attributes.XmlElements.Add(new XmlElementAttribute("Item"));
答案 2 :(得分:0)
我相信XMLIgnore属性应该用于装饰一个用XmlSerializable属性修饰的类的公共成员,这种方式可行。