4

を使用して Xml シリアライズを行っていXmlSerializerます。タイプClassAという名前のプロパティを含むのシリアル化を実行しています。の特定のプロパティをシリアル化したくありません。MyPropertyClassBClassB

XmlAttributeOverridesクラスは別のライブラリにあるため、使用する必要があります。プロパティがClassAそれ自体である場合、それは簡単でした。

XmlAttributeOverrides xmlOver = new XmlAttributeOverrides();
XmlAttributes xmlAttr = new XmlAttributes();
xmlAttr.XmlIgnore = true;
xmlOver.Add(typeof(ClassA), "MyProperty", xmlAttr);

XmlSerializer ser = new XmlSerializer(typeof(ClassA), xmlOver);

プロパティが入っていClassBて、シリアル化する必要がある場合、どのように達成するのClassAですか?

4

1 に答える 1

5

オーバーライドを更新して、ClassB代わりにを指すようにするだけClassAです。

XmlAttributeOverrides xmlOver = new XmlAttributeOverrides();
XmlAttributes xmlAttr = new XmlAttributes();
xmlAttr.XmlIgnore = true;

//change this to point to ClassB's property to ignore
xmlOver.Add(typeof(ClassB), "ThePropertyNameToIgnore", xmlAttr);

XmlSerializer ser = new XmlSerializer(typeof(ClassA), xmlOver);

与えられた簡単なテスト:

public class ClassA
{
    public ClassB MyProperty { get; set; }
}

public class ClassB
{
    public string ThePropertyNameToIgnore { get; set; }
    public string Prop2 { get; set; }
}

そしてエクスポート方法:

public static string ToXml(object obj)
{
    XmlAttributeOverrides xmlOver = new XmlAttributeOverrides();
    XmlAttributes xmlAttr = new XmlAttributes();
    xmlAttr.XmlIgnore = true;
    xmlOver.Add(typeof(ClassB), "ThePropertyNameToIgnore", xmlAttr);


    XmlSerializer xs = new XmlSerializer(typeof(ClassA), xmlOver);
    using (MemoryStream stream = new MemoryStream())
    {
        xs.Serialize(stream, obj);
        return System.Text.Encoding.UTF8.GetString(stream.ToArray());
    }
}

主な方法:

void Main()
{
    var classA = new ClassA {
        MyProperty = new ClassB {
            ThePropertyNameToIgnore = "Hello",
            Prop2 = "World!"
        }
    };

    Console.WriteLine(ToXml(classA));
}

これを "ThePropertyNameToIgnore" を省略して出力します。

<?xml version="1.0"?>
<ClassA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <MyProperty>
    <Prop2>World!</Prop2>
  </MyProperty>
</ClassA>
于 2013-07-30T13:19:13.967 に答える