2011-03-11 3 views
5

私は、仮想プロパティと仮想プロパティをオーバーライドする派生型を持つ基本クラスを持っています。型はXMLにシリアライズできます。私がやろうとしているのは、オブジェクトが派生型である場合、List of itemsプロパティを保持しないことです。これを達成するために、派生クラスは[XmlIgnore]属性でオーバーライドされたプロパティを装飾します。基本クラスの仮想プロパティはXmlIgnore属性を適用しません。オブジェクトが派生型(DynamicCart)であっても、何らかの理由でアイテムのリストが毎回シリアル化されます。.NETのXmlSerializerを使用する場合、派生クラスのプロパティを無視します。

属性をXmlIgnore属性を基本クラスの仮想プロパティに適用すると、リストはファイルにシリアル化されません。

public class ShoppingCart 
{ 
    public virtual List<items> Items{get; set;} 

    //and other properties 

    public void SerializeToXML (string filePath) 
    { 
    var xmlSerializer = new XmlSerializer(this.GetType()); 
    textWriter = new System.IO.StreamWriter(filePath); 
    xmlSerializer.Serialize(textWriter, this); 
    textWriter.Flush(); 
    textWriter.Close(); 
    } 
} 

//A cart that is populated by algo based on parameters supplied by user. I have no need to 
//persist the actual items across sessions. 
class DynamicCart: ShoppingCart 
{ 
    [XmlIgnore] 
    public override List<items>{get;set;} 
    //and other properties 
} 

class Shop 
{ 
    ShoppingCart cart = new DynamicCart(); 
    PopulateCart(cart); 
    cart.serializeToXML(<PATH TO FILE>); 
} 
+0

あなた自身が質問に答えたようです。 –

+0

DynamicCartをシリアル化するときにXMLSerializerがserivedクラスの[XMLIgnore]属性を受け入れず、List オブジェクトを含むのはなぜですか? – Ken

答えて

-1

XML直列化の基本クラスで派生型を宣言する必要があると思います。ちょっとばかげているけど、仕様通りです。

このMSDN pageを参照してください、そして、次の例を探します。

[System.Xml.Serialization.XmlInclude(typeof(Derived))] 
public class Base 
{ 
    // ... 
} 
+0

この属性をクラスに追加しても問題は解決しませんでした。 Serializerは、派生クラスのオーバーライドされたプロパティが[XMLIgnore]属性を持っていても、リストをシリアル化し続けました。私はついに終わりました。派生クラスからオーバーライドされたプロパティを削除します。派生クラスが直列化されている場合にXMLIgnore属性を適用するために条件付き直列化論理を基本クラスに書くこととを含む。 – Ken

+0

Serilizerが派生クラスの[XMLIgnore]属性を尊重しない理由についての手掛かりは何ですか? – Ken

-1

が、これはあなたがシリアライザはinclusdeしたい、あなたはできるだけ多くの種類を追加することができます。この

XmlSerializer serializer = new XmlSerializer(typeof(DynamicCart), new Type[]{typeof(ShoppingCart)}); 

を試してみてください。

0

あなたのシリアライザは、派生クラスの代わりにベースクラスを使用していると思います。

public void SerializeToXML(string filePath, Type type) 
{ 
    xmlSerializer = new XmlSerializer(type); 
    textWriter = new System.IO.StreamWriter(filePath); 
    xmlSerializer.Serialize(textWriter, this); 
    textWriter.Flush(); 
    textWriter.Close(); 
} 

class Shop 
{ 
    ShoppingCart cart= new DynamicCart(); 
    PopulateCart(cart); 
    cart.serializeToXML(<PATH TO FILE>, typeof(DynamicCart)); 
} 
0

仮想クラスShouldSerialize***を基本クラスに追加すると、これを行うことができます。たとえば:

[XmlInclude(typeof(Sub))] 
public class Base 
{ 
    public virtual string Prop { get; set; } 

    public virtual bool ShouldSerializeProp() { return true; } 
} 

public class Sub : Base 
{ 
    public override string Prop { get; set; } 

    public override bool ShouldSerializeProp() { return false; } 
} 

internal class Program 
{ 
    private static void Main() 
    { 
     var o = new Sub { Prop = "Value" }; 

     var baseSer = new XmlSerializer(typeof (Base)); 
     var subSer = new XmlSerializer(typeof (Sub)); 

     Console.Out.WriteLine("BASE:"); 
     baseSer.Serialize(Console.Out, o); 
     Console.Out.WriteLine(); 

     Console.Out.WriteLine("SUB:"); 
     subSer.Serialize(Console.Out, o); 
     Console.Out.WriteLine(); 

     Console.ReadLine(); 
    } 
} 

これは(少し片付け)生産:

BASE: 
<Base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Sub"> 
    <Prop>Value</Prop> 
</Base> 

SUB: 
<Sub /> 

方法はShouldInclude...後に検討するプロパティの正確な名前が含まれている必要があります。

関連する問題