2009-10-30 10 views
11

मेरे SomeClassDataContractSerializer ठीक से deserialize नहीं करता है, वस्तु में तरीकों के लिए मान अनुपलब्ध हैं

[Serializable] 
[DataContract(Namespace = "")] 
public class SomeClass 
{ 
    [DataMember] 
    public string FirstName 
    { 
     get; set; 
    } 

    [DataMember] 
    public string LastName 
    { 
     get; set; 
    } 

    [DataMember] 
    private IDictionary<long, string> customValues; 
    public IDictionary<long, string> CustomValues 
    { 
     get { return customValues; } 
     set { customValues = value; } 
    } 
} 

मेरे एक्सएमएल फ़ाइल:

<?xml version="1.0" encoding="UTF-8"?> 
<SomeClass> 
<FirstName>John</FirstName> 
<LastName>Smith</LastName> 
<CustomValues> 
    <Value1>One</Value1> 
    <Value2>Two</Value2> 
</CustomValues > 
</SomeClass> 

लेकिन मेरी समस्या वर्ग के लिए है, मैं केवल के कुछ हो रही है जब मैं deserialize मेरे तरीकों के लिए डेटा।

var xmlRoot = XElement.Load(new StreamReader(
        filterContext.HttpContext.Request.InputStream, 
        filterContext.HttpContext.Request.ContentEncoding)); 
XmlDictionaryReader reader = XmlDictionaryReader.CreateDictionaryReader(xmlRoot.CreateReader()); 
DataContractSerializer ser = new DataContractSerializer(typeof(SomeClass)); 
//Deserialize the data and read it from the instance. 
SomeClass someClass = (SomeClass)ser.ReadObject(reader, true); 

तो जब मैं "SomeClass" जाँच, FirstName मूल्य जॉन होगा, लेकिन अंतिम नाम अशक्त हो जाएगा।

रहस्य यह है कि मैं कुछ डेटा कैसे प्राप्त कर सकता हूं, न कि कक्षा के सभी डेटा। तो डेटाकंट्रैक्टसेरियलाइज़र deserializing जब xml से सभी डेटा खींच नहीं रहा है।

क्या मैं कुछ गलत कर रहा हूं।

किसी भी मदद की सराहना की जाती है। अग्रिम में धन्यवाद।

मुझे पता है अगर कोई एक ही समस्या है या किसी एक समाधान

+1

नहीं DataMember attr सार्वजनिक संपत्ति पर और नहीं निजी एक पर होना चाहिए? जाहिर है – Dani

उत्तर

16

है ठीक है मैं वह चारों ओर काफी खेलने के बाद अपने ही जवाब मिला करते हैं .... यह एक alpahbetical क्रम में हो गया है। इसलिए यदि वर्ग है

[Serializable] 
[DataContract(Namespace = "")]  
public class SomeClass 
{ 
    [DataMember] 
    public string FirstName 
    { 
     get; set; 
    } 

    [DataMember] 
    public string LastName 
    { 
     get; set; 
    } 

    [DataMember] 
    private IDictionary<long, string> customValues; 
    public IDictionary<long, string> CustomValues 
    { 
     get { return customValues; } 
     set { customValues = value; } 
    } 
} 

तो एक्सएमएल वर्णानुक्रम को परिभाषित किया जाना चाहिए।

<?xml version="1.0" encoding="UTF-8"?> 
<SomeClass> 
<CustomValues> 
    <Value1>One</Value1> 
    <Value2>Two</Value2> 
</CustomValues > 
<FirstName>John</FirstName> 
<LastName>Smith</LastName> 
</SomeClass> 

अच्छी तरह से क्यों एच ... इसे वर्णानुक्रम में होना चाहिए?

+1

'प्रदर्शन'। पागलपन! –

+0

ज्ञान के इस अद्भुत टुकड़े को पोस्ट करने के लिए धन्यवाद। मैं उसी कोड का हेडबैंग कर रहा हूं जो 'लगभग' घंटे के लिए काम करता है। त्वरित स्कीमा परिवर्तन और यह एक इलाज काम करता है। आपको आश्चर्य करना होगा कि यह उत्पाद में अधिक स्पष्ट रूप से क्यों प्रलेखित नहीं है। +1 –

+1

वाह, मैंने बस इस समाधान को खोजने का प्रयास करने के लिए घंटों बर्बाद कर दिए हैं। इससे कुछ गंभीर समस्याएं होती हैं यदि कोई वेब सेवा डब्लूएसडीएल स्पेक के लिए एक अलग क्रम में एक्सएमएल तत्व लौटाती है - इस मामले में एसवीसीयूटीटी द्वारा उत्पन्न प्रॉक्सी में गलत ऑर्डरिंग और deserialisation चुपचाप विफल हो जाएगा। – Oenotria

13

यही है Order विशेषता है; यदि आपके पास एक्सएमएल पर नियंत्रण नहीं है तो आप deserialize, यह एकमात्र कामकाज है जिसे मैं जानता हूं।

अपने पहले उदाहरण में है कि हो सकता है

[Serializable] 
[DataContract(Namespace = "")] 
public class SomeClass 
{ 
    [DataMember(Order = 0)] 
    public string FirstName 
    { 
     get; set; 
    } 

    [DataMember(Order = 1)] 
    public string LastName 
    { 
     get; set; 
    } 

    [DataMember(Order = 2)] 
    private IDictionary customValues; 
    public IDictionary CustomValues 
    { 
     get { return customValues; } 
     set { customValues = value; } 
    } 
} 
संबंधित मुद्दे