XmlIgnore не работает - PullRequest
       27

XmlIgnore не работает

2 голосов
/ 10 марта 2011

У меня есть объект, который я пытаюсь сериализовать, и вывод выглядит примерно так:

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

, но значение по-прежнему записывается в вывод.

Что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 10 марта 2011

Если значение всегда игнорируется, лучше назначить атрибут непосредственно члену.

[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 полностью.

2 голосов
/ 10 марта 2011

Теперь, когда вы обновили свой вопрос, очевидно, что вы делаете неправильно. :)

[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"));  
0 голосов
/ 10 марта 2011

Я полагаю, что атрибут XMLIgnore должен использоваться для украшения открытого члена класса, который был украшен атрибутом XmlSerializable, таким образом будет работать.

...