2011-03-11 21 views
5

'u kullanırken türetilmiş sınıflardaki özellikleri göz ardı etme Sanal özelliği ve sanal özelliği geçersiz kılan türetilmiş bir türe sahip bir temel sınıfım var. Bu tip XML'e serileştirilebilir. Yapmaya çalıştığım şey, nesne türetilmiş türdeyken öğe listesi özelliğini sürdürmemek. Bunu elde etmek için, türetilmiş sınıf [XmlIgnore] özniteliğiyle geçersiz kılınan özelliği süslemektedir. Temel sınıftaki sanal özellik XmlIgnore özniteliğini uygulamıyor. Nesnelerin listesi türetilmiş türden (DynamicCart) olsa bile, bazı nedenlerden dolayı Dizine Eklenir..NET'in XmlSerializer

Temel sınıftaki sanal özelliğe XmlIgnore özniteliğini uyguladığımda, liste dosyaya serileştirilmez.

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

Bu soruya kendiniz cevap vermişsiniz. –

+0

10 Sorunuma bir yanıt verdim ancak bir yanıt vermedim, XMLSerializer neden serive sınıfındaki [XMLIgnore] özniteliğini onurlandırmıyor ve DynamicCart'ı serileştirdiğimde Liste nesnesini içeriyor? – Ken

cevap

-1

XML serileştirme için temel sınıftaki türetilmiş türü bildirmeniz gerekir. Biraz aptalca geliyor, ama şartnameye göre.

bu MSDN page bakın ve aşağıdaki örnekte arayın:

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

Bu özniteliğin sınıfa eklenmesi sorunu çözmedi. Serializer, türetilmiş sınıftaki geçersiz kılınmış özelliğin [XMLIgnore] özelliğine sahip olmasına rağmen List 'u serileştirmeye devam etti. Sonunda sona erdi; geçersiz kılınan özelliği türetilmiş sınıftan kaldırma; ve türetilmiş sınıf serileştirilirse, XMLIgnore özniteliğini uygulamak için temel sınıftaki koşullu serileştirme mantığı yazılır. – Ken

+0

Serilizer'in türetilmiş sınıfımda neden [XMLIgnore] özelliğini onayladığına dair bir ipucu var mı? – Ken

-1

bu

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

bu kadar tür eklemek sağlayacak deneyin, serileştirici inclusde istiyorum.

0

Diziselleştiricinizin türetilmiş yerine temel sınıfınızı kullandığını düşünüyorum.

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

Temel sınıfa bir sanal ShouldSerialize*** yöntemi ekleyerek bunu yapabilirsiniz.

[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(); 
    } 
} 

Bu (biraz derli toplu) üretir: Örneğin

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

SUB: 
<Sub /> 

yöntem olmalıdır özelliğinin tam olarak adı ShouldInclude... sonra dikkate içerir.

İlgili konular