2011-03-11 16 views
5

का उपयोग करते समय व्युत्पन्न कक्षाओं पर गुणों को अनदेखा करना मेरे पास वर्चुअल प्रॉपर्टी के साथ एक बेस क्लास है और व्युत्पन्न प्रकार है जो वर्चुअल प्रॉपर्टी को ओवरराइड करता है। प्रकार को एक्सएमएल में क्रमबद्ध किया जा सकता है। मैं जो करने की कोशिश कर रहा हूं वह वस्तु संपत्ति की सूची को जारी रखने के लिए नहीं है जब ऑब्जेक्ट व्युत्पन्न प्रकार का होता है। इसे प्राप्त करने के लिए व्युत्पन्न वर्ग [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

मैंने अपने काम का जवाब नहीं दिया है, लेकिन मेरे प्रश्न का उत्तर नहीं है, XMLSerializer क्यों सीरियड क्लास में [XMLIgnore] विशेषता का सम्मान नहीं करता है और जब मैं डायनामिककार्ट को क्रमबद्ध करता हूं तो सूची ऑब्जेक्ट शामिल करता है? – Ken

उत्तर

-1

मैं आप XML क्रमांकन के लिए आधार वर्ग में व्युत्पन्न प्रकार की घोषणा करने की जरूरत है लगता है। थोड़ा मूर्खतापूर्ण लगता है, लेकिन विनिर्देशन द्वारा है।

इस MSDN page देखें, और निम्न उदाहरण के लिए देखो:

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

कक्षा में इस विशेषता को जोड़ने से समस्या हल नहीं हुई। सीरिएलाइज़र ने सूची को क्रमबद्ध करना जारी रखा, भले ही व्युत्पन्न वर्ग में ओवरराइड संपत्ति [XMLIgnore] विशेषता थी। मैं अंत में समाप्त हो गया; व्युत्पन्न वर्ग से ओवरराइड संपत्ति को हटा देना; और व्युत्पन्न वर्ग को क्रमबद्ध किया जा रहा है, तो XMLIgnore विशेषता लागू करने के लिए बेस क्लास में सशर्त serialization तर्क लिखना। – Ken

+0

किसी भी सुराग के कारण क्यों सेरिलाइज़र मेरे व्युत्पन्न वर्ग में [XMLIgnore] विशेषता का सम्मान नहीं करता है ?? – Ken

-1

प्रयास करें इस

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

यह आप के रूप में कई प्रकार जोड़ने के लिए अनुमति देगा, आप serializer inclusde करना चाहते हैं।

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

यह (थोड़ा tidied) का उत्पादन: उदाहरण के लिए:

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

SUB: 
<Sub /> 

विधि होनी चाहिए संपत्ति का सही नाम ShouldInclude... के बाद विचार करने के लिए शामिल हैं।