1

コード:

[Serializable]
public class MyClass
{
    [XmlElement("Company")]
    public string Company { get; set; }

    [XmlElement("Amount")]
    public decimal Amount { get; set; }

    public int companyid { get; set; }
}

で指定したものだけをシリアライズしたいのですが、companyidはシリアライズ[XmlElement]対象外です。

それで、なにかお手伝いできますか?

4

1 に答える 1

1

これは、LinqPad でまとめた簡単な例です。メソッドの最初の 4 行は、プロパティをシリアル化しないように に指示するために使用されるインスタンスをMain設定します。XmlAttributeOverridesXmlSerializercompanyid

void Main()
{
    //Serialize, but ignore companyid
    var overrides = new XmlAttributeOverrides();
    var attributes = new XmlAttributes();
    attributes.XmlIgnore = true;
    overrides.Add(typeof(MyClass), "companyid", attributes);

    using(var sw = new StringWriter()) {
        var xs = new XmlSerializer(typeof(MyClass), overrides);
        var a = new MyClass() { 
                                       Company = "Company Name", 
                                       Amount = 10M, 
                                       companyid = 7 
                                   };
        xs.Serialize(sw, a);
        Console.WriteLine(sw.ToString());
    }
}

[Serializable]
public class MyClass
{
    [XmlElement("Company")]
    public string Company { get; set; }

    [XmlElement("Amount")]
    public decimal Amount { get; set; }

    public int companyid { get; set; }
}

このプログラムの出力は次のとおりです。

<?xml version="1.0" encoding="utf-16"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Company>Company Name</Company>
  <Amount>10</Amount>
</MyClass>

クラスを調べて、XmlElementAttribute存在しないことに基づいて除外するプロパティを決定するためにこのコードが必要な場合は、上記のコードを変更して、リフレクションを使用してオブジェクトのプロパティを列挙することができます。を持たないすべてのプロパティについて、アイテムをインスタンスXmlElementAttributeに追加します。overrides

例えば:

void Main()
{
    //Serialize, but ignore properties that do not have XmlElementAttribute
    var overrides = new XmlAttributeOverrides();
    var attributes = new XmlAttributes();
    attributes.XmlIgnore = true;
    foreach(var prop in typeof(MyClass).GetProperties())
    {
        var attrs = prop.GetCustomAttributes(typeof(XmlElementAttribute));
        if(attrs.Count() == 0)
            overrides.Add(prop.DeclaringType, prop.Name, attributes);
    }

    using(var sw = new StringWriter()) {
        var xs = new XmlSerializer(typeof(MyClass), overrides);
        var a = new MyClass() { 
                                Company = "Company Name", 
                                Amount = 10M, 
                                companyid = 7,
                                blah = "123" };
        xs.Serialize(sw, a);
        Console.WriteLine(sw.ToString());
    }
}

[Serializable]
public class MyClass
{
    [XmlElement("Company")]
    public string Company { get; set; }

    [XmlElement("Amount")]
    public decimal Amount { get; set; }

    public int companyid { get; set; }

    public string blah { get; set; }
}
于 2013-04-10T06:18:36.530 に答える