2012-06-18 11 views
19

पर फ़ाइल को deserialize फ़ाइल मेरे पास एक डेटा क्लास है जो DataContractSerializer के साथ क्रमबद्ध है। वर्ग [DataContract] विशेषता का उपयोग करता है जिसमें कोई स्पष्ट Namespace घोषणा नहीं है। इस प्रकार, परिणामी xml फ़ाइल में नामस्थान कक्षा के नामस्थान के आधार पर उत्पन्न होता है।DataContractSerializer - नामस्थान बदलें और पुरानी नेमस्पेस

वर्ग मूल रूप से इस तरह दिखता है:

namespace XYZ 
{ 
    [DataContract] 
    public class Data 
    { 
     [DataMember(Order = 1)] 
     public string Prop1 { get; set; } 

     [DataMember(Order = 2)] 
     public int Prop2 { get; set; } 
    } 
} 

... और जिसके परिणामस्वरूप xml:

<?xml version="1.0" encoding="utf-8"?> 
<Data xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/XYZ"> 
    <Prop1>StringValue</Prop1> 
    <Prop2>11</Prop2> 
</Data> 

अब मैं (वास्तव में यह निकालने के लिए) वर्ग के नाम स्थान को बदलने के लिए बदलकर चाहते [DataContract][DataContract(Namespace = "")] पर विशेषता। हालांकि, एक बार जब मैं ऐसा करता हूं तो पहले मूल नामस्थान के साथ क्रमबद्ध किया गया था, जिसके साथ अब deserialize नहीं है।

Error in line 1 position XXX. Expecting element 'Data' from namespace ''.. Encountered 'Element' with name 'Data', namespace 'http://schemas.datacontract.org/2004/07/XYZ'.

यह एकदम सही समझ में आता है: मैं निम्न अपवाद प्राप्त करते हैं। मैंने नामस्थान बदल दिया। आई 'म ओके विद दैट। हालांकि, ऐसा लगता है कि आगे बढ़ने के लिए DataContractSerializer बताने का तरीका होना चाहिए और उस डेटा को deserialize करें, भले ही नामस्थान मेल नहीं खाते हैं।

+0

आप डेटाकंट्रैक्ट विशेषता में नामस्थान के लिए खाली स्ट्रिंग निर्दिष्ट क्यों करना चाहते हैं? ऐसा करके आप क्या प्राप्त कर रहे हैं? –

+2

मुझे कक्षा के सीएलआर नेमस्पेस से बंधे नहीं हैं; और यह वास्तव में यहाँ समस्या है। यह वर्ग अपने सीएलआर नेमस्पेस को बदल रहा है और मैं उस कार्यान्वयन विस्तार से बंधना नहीं चाहता हूं। मैं, निश्चित रूप से, एक एक्सएमएल नेमस्पेस मान परिभाषित कर सकता हूं जिसे मैं स्थिर रख सकता हूं। लेकिन इस कार्यान्वयन के लिए मुझे बस बनाम एक्सएमएल नेमस्पेस को हटाने का लाभ नहीं दिख रहा है। इसका उपयोग सरल फ़ाइल क्रमिकरण के लिए किया जा रहा है। – harlam357

उत्तर

15

एक संभावित तरीका एक पाठक में धारावाहिक द्वारा उपयोग किए गए पाठक को लपेटना है जो पुराने नामस्थान को नए जैसा दिखाता है, जैसा कि नीचे दिखाया गया है। बहुत सारे कोड, लेकिन ज्यादातर तुच्छ।

public class StackOverflow_11092274 
{ 
    const string XML = @"<?xml version=""1.0"" encoding=""utf-8""?> 
<Data xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/XYZ""> 
    <Prop1>StringValue</Prop1> 
    <Prop2>11</Prop2> 
</Data>"; 

    [DataContract(Name = "Data", Namespace = "")] 
    public class Data 
    { 
     [DataMember(Order = 1)] 
     public string Prop1 { get; set; } 

     [DataMember(Order = 2)] 
     public int Prop2 { get; set; } 
    } 

    public class MyReader : XmlReader 
    { 
     XmlReader inner; 
     public MyReader(XmlReader inner) 
     { 
      this.inner = inner; 
     } 

     public override int AttributeCount 
     { 
      get { return inner.AttributeCount; } 
     } 

     public override string BaseURI 
     { 
      get { return inner.BaseURI; } 
     } 

     public override void Close() 
     { 
      inner.Close(); 
     } 

     public override int Depth 
     { 
      get { return inner.Depth; } 
     } 

     public override bool EOF 
     { 
      get { return inner.EOF; } 
     } 

     public override string GetAttribute(int i) 
     { 
      return inner.GetAttribute(i); 
     } 

     public override string GetAttribute(string name, string namespaceURI) 
     { 
      return inner.GetAttribute(name, namespaceURI); 
     } 

     public override string GetAttribute(string name) 
     { 
      return inner.GetAttribute(name); 
     } 

     public override bool IsEmptyElement 
     { 
      get { return inner.IsEmptyElement; } 
     } 

     public override string LocalName 
     { 
      get { return inner.LocalName; } 
     } 

     public override string LookupNamespace(string prefix) 
     { 
      return inner.LookupNamespace(prefix); 
     } 

     public override bool MoveToAttribute(string name, string ns) 
     { 
      return inner.MoveToAttribute(name, ns); 
     } 

     public override bool MoveToAttribute(string name) 
     { 
      return inner.MoveToAttribute(name); 
     } 

     public override bool MoveToElement() 
     { 
      return inner.MoveToElement(); 
     } 

     public override bool MoveToFirstAttribute() 
     { 
      return inner.MoveToFirstAttribute(); 
     } 

     public override bool MoveToNextAttribute() 
     { 
      return inner.MoveToNextAttribute(); 
     } 

     public override XmlNameTable NameTable 
     { 
      get { return inner.NameTable; } 
     } 

     public override string NamespaceURI 
     { 
      get 
      { 
       if (inner.NamespaceURI == "http://schemas.datacontract.org/2004/07/XYZ") 
       { 
        return ""; 
       } 
       else 
       { 
        return inner.NamespaceURI; 
       } 
      } 
     } 

     public override XmlNodeType NodeType 
     { 
      get { return inner.NodeType; } 
     } 

     public override string Prefix 
     { 
      get { return inner.Prefix; } 
     } 

     public override bool Read() 
     { 
      return inner.Read(); 
     } 

     public override bool ReadAttributeValue() 
     { 
      return inner.ReadAttributeValue(); 
     } 

     public override ReadState ReadState 
     { 
      get { return inner.ReadState; } 
     } 

     public override void ResolveEntity() 
     { 
      inner.ResolveEntity(); 
     } 

     public override string Value 
     { 
      get { return inner.Value; } 
     } 
    } 

    public static void Test() 
    { 
     DataContractSerializer dcs = new DataContractSerializer(typeof(Data)); 
     MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(XML)); 
     try 
     { 
      XmlReader r = XmlReader.Create(ms); 
      XmlReader my = new MyReader(r); 
      Data d = (Data)dcs.ReadObject(my); 
      Console.WriteLine("Data[Prop1={0},Prop2={1}]", d.Prop1, d.Prop2); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
     } 
    } 
} 
+2

यह बहुत अच्छा काम किया! मैं गलत स्तर पर समस्या पर हमला कर रहा था। बहुत बहुत धन्यवाद! मेरे पास कुछ और जटिल डेटा प्रकार हैं जिनमें 'शब्दकोश ' उदाहरण शामिल हैं जो थोड़ा और कठिन साबित हुए हैं। प्रत्येक केवीपी के लिए टैग बदल गए, मैं नामस्थान परिवर्तन के आधार पर मानता हूं, जैसे: '' to ''। मुझे इन फ़ाइलों पर मैन्युअल रूपांतरण करना पड़ा लेकिन यह ठीक है। ये फ़ाइलें/प्रकार एक अल्पसंख्यक का प्रतिनिधित्व करते हैं जिसे पढ़ने की आवश्यकता है। – harlam357

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