3

我有一个我正在尝试序列化的对象,输出看起来像这样:

 <root>
  <Items>
    <Item>   
      <Value> blabla </Value>
    </Item>  
  </Items>

其中 Item 是类根使用的类。

[Serializable]
[XmlType("root")]
public class Root { }

[Serializable]
[XmlInclude(typeof(Item))]
public class Items {}

[Serializable]
public class Item 
{ 
    [XmlElement("Value")]
    public string DefaultValue { get; set; }
}

在某些情况下,我想忽略 value 的值,我有这段代码

 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);

但该值仍写入输出中。

我究竟做错了什么?

4

3 回答 3

3

如果 value 总是被忽略,你最好将属性直接分配给成员。

[Serializable]
[XmlInclude(typeof(Item))]
public class Items
{
    [XmlIgnore]
    public string Value
}

如果 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,因为ValueItems. 或者,如果您喜欢它,它可能会一直Value存在。ItemItem

于 2011-03-10T12:57:11.980 回答
3

现在您更新了问题,很明显您做错了什么。:)

[Serializable]
public class Item 
{ 
    [XmlElement("Value")]
    public string DefaultValue { get; set; }
}

您应该传递属性的名称,而不是文档中指定的 xml 名称。

overrides.Add(typeof(Item), "DefaultValue", attributes);

... 代替 ...

overrides.Add(typeof(Item), "Value", attributes);

同样如 Fun Mun Pieng 的回答中所述,您不应再添加 XmlElementAttribute ,因此请删除以下行:

 attributes.XmlElements.Add(new XmlElementAttribute("Item"));  
于 2011-03-10T14:30:20.467 回答
0

我相信 XMLIgnore 属性应该用于装饰已用 XmlSerializable 属性装饰的类的公共成员,这样就可以了。

于 2011-03-10T12:51:00.373 回答