2010-11-30 5 views
5

मेरे पास वास्तव में एक सरल अनुकूलित संग्रह प्रकार है जो सूची <> से प्राप्त होता है और संग्रहडेटाकंट्रैक्ट का उपयोग करता है।क्या डब्लूसीएफ और डेटाकंट्रैक्टसेरियलाइज़र कलेक्शनडाटा कंट्रैक्ट-सजाए गए संग्रह प्रकारों को क्रमबद्ध करें?

जब मैं DataContractSerializer.WriteObject का उपयोग इसे क्रमबद्ध करने के लिए करता हूं, तो यह संग्रहडेटा कंट्रैक्ट विशेषता का सम्मान करता है जिस तरह से मैं अपेक्षा करता हूं; हालांकि, जब मैं इसे डब्लूसीएफ विधि के लिए रिटर्न प्रकार के रूप में उपयोग करता हूं, तो मुझे डिफ़ॉल्ट ArrayOfFoo मिलता है।

मुझे आश्चर्य है कि क्या कुछ सजावट है जो मुझे सेवा अनुबंध में याद आ रही है।

विवरण:,

<FooList> 
    <Foo> 
     <BarString>myString1</BarString> 
    </Foo> 
</FooList> 

लेकिन अगर मैं एक है:

[DataContract(Namespace = "")] 
public class Foo 
{ 
    [DataMember] 
    public string BarString { get; set; } 
} 

[CollectionDataContract(Namespace = "")] 
[Serializable] 
public class FooList : List<Foo> {} 

मैं सिर्फ एक फू का दृष्टांत और फिर इसे क्रमानुसार करने DataContractSerializer.WriteObject उपयोग करते हैं, मैं आपकी आशा से मिलता है इस तरह की विधि के साथ सेवा ...

[ServiceContract Name = "MyService"] 
public interface IMyService 
{ 
    [OperationContract, WebGet(UriTemplate = "foos/")] 
    FooList GetAllFoos(); 
} 

और फिरके लिए एक GET करें, मैं इस मिल:

<ArrayOfFoo> 
    <Foo> 
     <BarString>myString1</BarString> 
    </Foo> 
</ArrayOfFoo> 

मैं भी CollectionDataContract विशेषता में निर्दिष्ट नाम = "MyFooListName" की कोशिश की है। वही परिणाम: DataContractSerializer ज्ञापन प्राप्त करता है; डब्ल्यूसीएफ नहीं करता है।

+0

मुझे लगता है, हाँ, यह सूचियों को सरणी में परिवर्तित करता है। –

+0

यदि आप संग्रह प्रकार को कस्टमाइज़ नहीं करते हैं तो आप सही हैं कि एक सूची को ऐरे में क्रमबद्ध किया जाता है; जो मैं समझने की कोशिश कर रहा हूं वह यह है कि डब्ल्यूसीएफ को मेरे कलेक्शनडाटा कंट्रैक्ट का सम्मान करने का कोई तरीका है या नहीं। – pisomojado

उत्तर

3

सईद ने मुझे सही दिशा में भेजा: मैं अनजाने में XmlSerializer के साथ समाप्त हुआ, जब मैं DataContractSerializer की उम्मीद कर रहा था।

मैं XmlSerializer के साथ समाप्त हुआ ... अच्छा ... इसके लिए पूछकर। इस तरह XmlSerializerFormat के साथ मेरी सेवा में

विशेष रूप से, मैं सजाया था तरीके:

[ServiceContract Name = "MyService"] 
public interface IMyService 
{ 
    // ... other stuff ... 

    [OperationContract, WebInvoke(UriTemplate = "foos/", Method = "POST")] 
    [XmlSerializerFormat] 
    Foo PostAFoo(Foo yourNewFoo); 
} 

मैं हाथ से लुढ़का फू एक्सएमएल धब्बे में सदस्य क्रम क्षमा की उम्मीद में इस किया था।बेशक, जब कोई ऐसा करता है तो यह XmlSerializer के साथ समाप्त होता है, डेटाकंट्रैक्टसेरियलाइज़र नहीं।

जब मैं XmlSerializerFormat विशेषता को दूर करता हूं, समस्या हल हो जाती है: डब्ल्यूसीएफ अब मेरे फूलीस्ट संग्रह को जिस तरह से चाहता है उसे क्रमबद्ध कर रहा है।

+0

मैंने उपरोक्त कोड का परीक्षण नहीं किया है, लेकिन यह संग्रह के लिए ठीक काम करता है? –

2

विस्तार के लिए MSDN देखें:

DataContractSerializer XmlSerializer और ASP.NET वेब सेवाओं द्वारा उपयोग नहीं समर्थन प्रोग्रामिंग मॉडल है। विशेष रूप से, यह XmlElementAttribute और XmlAttributeAttribute जैसे समर्थन गुण नहीं है। इस प्रोग्रामिंग मॉडल के लिए समर्थन सक्षम करने के लिए, डब्ल्यूसीएफ को डेटाकंट्रैक्टसेरियलाइज़र के बजाय XmlSerializer का उपयोग करने के लिए स्विच किया जाना चाहिए।

तो सीरियलाइजेशन XMLSerializer द्वारा किया जा रहा है, और आप इसे बदल नहीं सकते हैं।

0

क्या आपने अपनी डब्ल्यूसीएफ सेवा को कॉन्फ़िगर करते समय सामान्य प्रकार का चयन किया है? यदि नहीं, तो

राइट क्लिक करें और कॉन्फ़िगरेशन पर जाएं, फिर सामान्य प्रकार का चयन करें, डिफ़ॉल्ट रूप से यह सरणीसूची प्रकार है।

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