2009-11-10 14 views
11

मैं इस तरह संरचना है:नेट एक्सएमएल क्रमबद्धता और विरासत

public interface A 
{ 
    public void method(); 
} 

public class B : A 
{ 
} 

public class C : A 
{ 
} 

List<A> list; 

सूची प्रकार बी और सी की वस्तुओं वे भी कुछ क्षेत्रों है कि मैं रखने के लिए करना चाहते हैं होता है, अब मैं यह क्रमानुसार कर सकते हैं, वापस deserialize और उचित वस्तु उदाहरण प्राप्त करें? अधिमानतः एक्सएमएल को

संपादित करें:

इस सूची है कि इंटरफेस शामिल क्रमानुसार, और फिर बी और सी उदाहरणों को इसे वापस deserialize के लिए किसी भी आसान तरीका है?

उत्तर

4

से आप y DataContractSerializer प्रयोग करके देखें:

public interface A 
{ 
} 

public class B : A 
{ 
} 

public class C : A 
{ 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<A> list = new List<A>(new A[] { new B(), new C() }); 
     var serializer = new DataContractSerializer(
      list.GetType(), new[] { typeof(B), typeof(C) }); 

     var sb = new StringBuilder(); 
     using (var stringWriter = new StringWriter(sb)) 
     using (var writer = XmlWriter.Create(stringWriter)) 
     { 
      serializer.WriteObject(writer, list); 
     } 

     using (var stringReader = new StringReader(sb.ToString())) 
     using (var reader = XmlReader.Create(stringReader)) 
     { 
      list = (List<A>)serializer.ReadObject(reader); 
     } 

    } 
} 
4

हाँ, पर आप XmlElement साथ खेलने के लिए है, XmlRoot और XmlArray गुण। प्रत्येक प्रकार के अपने तत्व का नाम चाहिए।

संपादित करें: कुछ नमूना कोड। सभी वर्ग एक सामान्य आधार वर्ग से व्युत्पन्न होते हैं।

यहां एक नमूना कोड है:

[XmlRoot(ElementName="Root")] 
public sealed class SomeObject 
{ 

    private BaseObject _Object; 

    [XmlElement(Type=typeof(App.Projekte.Projekt), ElementName="Projekt")] 
    [XmlElement(Type=typeof(App.Projekte.Task), ElementName="Task")] 
    [XmlElement(Type=typeof(App.Projekte.Mitarbeiter), ElementName="Mitarbeiter")] 
    public BaseObject Object 
    { 
     get 
     { 
      return _Object; 
     } 
     set 
     { 
      _Object = value; 
     } 
    } 
} 

संपादित करें: क्रमबद्धता गुण निकालें के रूप में यह आवश्यक नहीं है (लेकिन अपने प्रोजेक्ट जहां कोड से है की जरूरत है)

+1

आप की जरूरत नहीं है '[Serializable]'। इसका उपयोग एक्सएमएल सीरियलाइजेशन द्वारा नहीं किया जाता है। –

6

आप उपयोग कर रहे मानते हुए बनाया आप serializer निर्देश देने

System.Xml.Serialization.XmlIncludeAttribute 

यह अनुमति देता है जब serializing अन्य प्रकार के शामिल करने के लिए/डी: .net एक्सएमएल क्रमबद्धता में आप निम्न विशेषता पर एक नज़र रखना चाहिए serializing।

सूची में नए प्रकार जोड़ने और क्रमबद्धता मेटा डेटा अपडेट नहीं हो गलतियों के आम स्रोत, सुनिश्चित करें कि आप पर्याप्त परीक्षण कवरेज करते हैं।

0

अपने मामले के लिए एक अमूर्त वर्ग की तरह अपने इंटरफेस को लागू करता है:

abstract class Abs : A 

और फिर पेट

public class B : Abs 
public class C : Abs 

और सूची सूची से अपनी कक्षाओं निकाले जाते हैं;

अब XmlSerializer के प्रकार सरणी में अपने प्रकार जोड़ने के लिए XmlIncludeAttribute का उपयोग करें।

5

मैं (के रूप में एक ही इंटरफ़ेस का एक प्रकार को क्रमानुसार नहीं कर सकता) एक अंतरफलक के बजाय एक अमूर्त वर्ग का प्रयोग करेंगे, तो मुश्किल XmlInclude विशेषता का उपयोग प्रकार कोडिंग के बजाय, मैं भी जाना जाता है प्रकार XmlSerializer को सीरियल में जोड़ना होगा और इसलिए जैसे deserialize तरीके:

string listXml = Serialize<List<A>>(ListA, new Type[] { typeof(B), typeof(C) }); 

    List<IA> NewList = Deserialize<List<A>>(listXml, new Type[] { typeof(B), typeof(C) }); 

    private static T Deserialize<T>(string Xml, Type[] KnownTypes) 
    { 
     XmlSerializer xs = new XmlSerializer(typeof(T),KnownTypes); 

     StringReader sr = new StringReader(Xml); 
     return (T)xs.Deserialize(sr); 
    } 

    private static string Serialize<T>(Object obj, Type[] KnownTypes) 
    { 
     StringBuilder sb = new StringBuilder(); 
     using (StringWriter sw = new StringWriter(sb)) 
     { 
      XmlSerializer xs = new XmlSerializer(typeof(T), KnownTypes); 

      xs.Serialize(sw, obj); 
     } 
     return sb.ToString(); 
    } 
0

XmlSerializer इंटरफेस के साथ काम नहीं करता।तो अगर आप कर सकते हैं:

Convert इंटरफ़ेस अमूर्त वर्ग के लिए और फिर इसके लिए XmlIncludeAttribute का उपयोग करें या XmlSerializer

या

को KnownTypes प्रदान माता पिता प्रकार के लिए लागू IXmlSerializable

या

उपयोग करने पर विचार DataContractSerializer .NET 3.0

संबंधित मुद्दे