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

場合によっては、値の値を無視したいのですが、このコードがあります

 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
于 2011-03-10T14:30:20.467 に答える
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

于 2011-03-10T12:57:11.980 に答える
0

XMLIgnore 属性を使用して、XmlSerializable 属性で装飾されたクラスのパブリック メンバーを装飾する必要があると思います。

于 2011-03-10T12:51:00.373 に答える