2013-11-14 8 views
10

का उपयोग करके deserialized नहीं किया जा रहा है मुझे DataContractSerializer के साथ कोई समस्या है। मैं एएसपी.NET वेब सेवा द्वारा लौटाए गए एक्सएमएल से क्लास इंस्टेंस बनाने के लिए इसका इस्तेमाल करता हूं। लेकिन वास्तव में डेटा का स्रोत यहां महत्वपूर्ण नहीं है। पूरे मामले को डीबग करना आसान बनाने के लिए मैंने केवल सीरियलाइजेशन के साथ एक सरल परीक्षण प्रोजेक्ट बनाया है और समस्या अभी भी होती है।कुछ गुणों को DataContractSerializer

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<GetTestURL p1:type="MyApp.GetTestUrlInfo" xmlns:p1="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices"> 
    <TestURL>http://bing.com</TestURL> 
    <UserCount p1:type="Edm.Int32">1</UserCount> 
    <InitialCount p1:type="Edm.Int32">1</InitialCount> 
    <AverageExecutionTime p1:type="Edm.Int32">43</AverageExecutionTime> 
</GetTestURL> 

वर्ग मैं करने के लिए XML deserialize करने के लिए कोशिश कर रहा हूँ:

[DataContract(Name = "GetTestURL", Namespace = "http://schemas.microsoft.com/ado/2007/08/dataservices")] 
public class TestInfo 
{ 
    [DataMember(Name = "TestURL")] 
    public Uri TestUri { get; private set; } 

    [DataMember(Name = "UserCount")] 
    public int UserCount { get; private set; } 

    [DataMember(Name = "InitialCount")] 
    public int InitialCount { get; private set; } 

    [DataMember(Name = "AverageExecutionTime")] 
    public int AverageExecutionTime { get; private set; } 
} 

और मेरे क्रमबद्धता सहायक वर्ग:

public static class SerializationHelper<T> 
{ 
    private static DataContractSerializer _serializer = new DataContractSerializer(typeof(T)); 

    public static T Deserialize(Stream source) 
    { 
     return (T)_serializer.ReadObject(source); 
    } 
} 

टेस्ट कोड

यहाँ मेरी एक्सएमएल है:

// Test program 
public static void Main() 
{ 
    TestInfo info = null; 
    using (var stream = File.Open("Input.xml", FileMode.Open, FileAccess.Read)) 
    { 
     info = SerializationHelper<TestInfo>.Deserialize(stream); 
    } 
} 

विधि के अंत में brakepoint स्थापित करने के बाद मैं निम्न देखें:

enter image description here

आप देख सकते हैं, दोनों AverageExecutionTime और InitialCount deserialized और int डिफ़ॉल्ट मान नहीं रहे हैं। उन्हें 43 और 1 पर सेट करना चाहिए, क्योंकि ये मान XML में हैं।

यह मेरे लिए और भी अजीब बात है, UserCount संपत्ति सही हो गई है, लेकिन वास्तव में यह उन दोनों में से भिन्न नहीं है जो बिल्कुल काम नहीं करते हैं। तत्व का नाम केवल एक चीज अलग है।

+0

संभव नकल http://stackoverflow.com/questions/15413468/deserializing-xml-with-datacontractserializer?rq=1 –

उत्तर

10

मैं डेटा अनुबंध अपडेट करके इसे काम करने में कामयाब रहा। आदेश के साथ कुछ करने के लिए। जब मैंने उरी को एक आवश्यक संपत्ति बनाई तो उसने अपवाद फेंक दिया, इसलिए लोड ऑर्डर के साथ ऐसा कुछ हो सकता है।

[DataContract(Name = "GetTestURL", Namespace = "http://schemas.microsoft.com/ado/2007/08/dataservices")] 
    public class TestInfo 
    { 
     public TestInfo() { } 
     public TestInfo(Uri uri, int userCount, int initialCount, int averageExecutionTime) 
     { 
      TestUri = uri; 
      UserCount = userCount; 
      InitialCount = initialCount; 
      AverageExecutionTime = averageExecutionTime; 
     } 
     [DataMember(Name = "TestURL", IsRequired=true, Order=1)] 
     public Uri TestUri { get; private set; } 

     [DataMember(Name = "UserCount", IsRequired=true, Order=2)] 
     public int UserCount { get; private set; } 

     [DataMember(Name = "InitialCount", IsRequired=true, Order=3)] 
     public int InitialCount { get; private set; } 

     [DataMember(Name = "AverageExecutionTime", IsRequired=true, Order=4)] 
     public int AverageExecutionTime { get; private set; } 
    } 
+0

क्या आपको पता है क्यों यह बिना 'Order' /' काम नहीं करता है IsRequired' ? – MarcinJuraszek

+1

@MarcinJuraszek मैंने दो परीक्षण किए, सभी आवश्यक और ऑर्डर गुणों को हटा दिया और तत्वों को क्रमबद्ध रूप से ऑर्डर करने के लिए इनपुट xml को बदल दिया। * काम किया * IsRequired हटा दिया और आदेश के रूप में रखा है। * काम किया * ऐसा प्रतीत होता है कि धारावाहिक दस्तावेज़ को पढ़ने के लिए आपकी कक्षा का उपयोग कर रहा है। यदि आप ऑर्डर निर्दिष्ट नहीं करते हैं, तो यह सही अनुक्रम में तत्वों को देखने के लिए नहीं जानता है। डिफ़ॉल्ट रूप से उपयोग किया गया अनुक्रम वर्णमाला है। –

+4

@MarcinJuraszek 'DataContractSerializer' दस्तावेज [XML] [http://msdn.microsoft.com/en-us/library/ms729813.aspx) पर XML में तत्वों के सख्त क्रम का उपयोग/अपेक्षा करता है। यदि आपके एक्सएमएल तत्व नियमों के अनुसार डिफ़ॉल्ट क्रम में प्रकट नहीं होंगे, तो आपको पैट्रिक के उत्तर में दिखाए गए अनुसार '[डेटामेम्बर]' विशेषता में ऑर्डर निर्दिष्ट करना होगा। –

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