2009-09-26 16 views
7

मैं डब्ल्यूसीएफ रीस्टफुल वेब सेवाओं के साथ प्रयोग कर रहा हूं और मुझे ऑटो-कार्यान्वित गुणों में समस्या है।डब्ल्यूसीएफ एक्सएमएल सीरियलाइजेशन और ऑटोइम्प्लीफाइड प्रॉपर्टीज

[ServiceContract] 
public interface IChooser 
{ 
[WebGet(UriTemplate="/Chooser/RegisteredDevices")] 
[OperationContract] 
List<DeviceDescriptor> RegisteredDevices(); 

[WebGet(UriTemplate = "/Chooser/Ping")] 
[OperationContract] 
string Ping(); 
} 

: - यहाँ मेरी सेवा अनुबंध है

public class DeviceDescriptor 
{ 
    public string DeviceId { get; set; } 
    public string DisplayName { get; set; } 
} 

मैं एक RESTful WCF सेवा है कि DeviceDescriptors की एक सूची वापस करने के लिए माना जाता है है:

मैं इस प्रकार के रूप में परिभाषित एक वर्ग DeviceDescriptor कहा जाता है, खैर, यह काम करता है, सिवाय इसके कि एक्सएमएल आउटपुट में, संपत्ति के नाम सही नहीं आते हैं, ऐसा लगता है कि सीरिएलाइज़र संपत्ति नामों के बजाय स्वत: जेनरेट किए गए बैकिंग फ़ील्ड के "अचूक नाम" का उपयोग कर रहा है। मेरा आउटपुट इस तरह से निकलता है:

<DeviceDescriptor> 
    <_x003C_DeviceId_x003E_k__BackingField>Pipe.Dome</_x003C_DeviceId_x003E_k__BackingField> 
    <_x003C_DisplayName_x003E_k__BackingField>Pipe diagnostic tool</_x003C_DisplayName_x003E_k__BackingField> 
</DeviceDescriptor> 

तो, क्या इसका कोई तरीका है? WCF संपत्ति नामों का उपयोग क्यों नहीं करता?

+0

StackOverflow विरोधाभास: मैं बस इस आइटम के लिए 'लोकप्रिय सवाल' बैज जीता, अभी तक सिर्फ एक ही वोट दें है। –

उत्तर

4

यह आईआईआरसी प्राप्त करने के लिए प्रतिबिंब का उपयोग करता है, यदि आप अधिक नियंत्रण चाहते हैं तो आपको डेटाकंट्रैक्ट का उपयोग करने का प्रयास करना चाहिए, यह आपको सटीक नाम निर्दिष्ट करने की अनुमति देता है ([DataMember(Name = "DeviceID")] का उपयोग करके)। DataMemberAttribute

+0

उसने ऐसा किया। मुझे वर्ग पर [DataContract] विशेषता और फिर [डेटामेम्बर (नाम = "xxx") गुण गुणों, shazamm पर गुण देना पड़ा। हालांकि यह थोड़ी सुगंधित है।मुझे आश्चर्य है कि क्यों डब्ल्यूसीएफ को माना जाता है कि निजी ऑटो-लागू बैकिंग फ़ील्ड और सार्वजनिक संपत्ति के नामों के बजाय उनका उपयोग क्यों करते हैं? सी # कंपाइलर कुछ डोडी कोड पीढ़ी करना चाहिए। –

+0

जैसा कि मैंने कहा था, यह शायद उस स्थान को पाने के लिए प्रतिबिंब का उपयोग करता है जहां संपत्ति मूल्य संग्रहीत किया जाता है, न कि संपत्ति का नाम; लेकिन मैं डब्ल्यूसीएफ पर कोई विशेषज्ञ नहीं हूं, इसलिए आपको शायद एक प्रश्न पूछना चाहिए कि डब्ल्यूसीएफ वास्तव में नामों को कैसे खोजता है;) – Anteru

+0

(आपने मुख्य प्रश्न का पूरी तरह उत्तर दिया है, लेकिन टिप्पणियों का पालन करने के लिए मैं नीचे उन बिंदुओं पर संक्षेप में स्पर्श करता हूं) –

9

पर दिए गए प्रश्नों में कुछ विवरण जोड़ने के लिए ... पुराने पुराने (3.0) दिनों में डब्लूसीएफ/DataContractSerializer बहुत सख्त था। यदि आपका प्रकार [DataContract] (या IXmlSerializable फ़ॉलबैक के लिए स्पष्ट रूप से चिह्नित नहीं किया गया था) तो यह क्रमबद्ध नहीं होगा। निर्दिष्ट किए गए गुण पर स्पष्ट नाम का उपयोग करके, या अन्यथा सदस्य-नाम अन्यथा, [DataMember] के रूप में चिह्नित सदस्यों का उपयोग किया जाता है। जीवन अच्छा था।

हाल ही में, कोड बदल दिया गया था "नियमित" प्रकारों को क्रमबद्ध करने की अनुमति - अर्थात्: डेटा-अनुबंध के बिना। यह BinaryFormatter उपयोगों के समान दृष्टिकोण का उपयोग करता है - यानी यह फ़ील्ड -level पर काम करता है। इस IMO बुरा है:

  • क्षेत्रों कार्यान्वयन, नहीं अनुबंध कर रहे हैं
  • यह भंगुर है अगर आप बदलना ... कुछ भी!
  • यह एक से/स्विच के रूप में के रूप में निर्दोष
  • कुछ कहानियो के खिलाफ ज्यादा पानी नहीं रखता है ऑटो-प्रोप यह (ऑटो-सहारा, कि में नियमित रूप से सी # नकल करते नहीं किया जा सकता सही मायने में विचित्र फ़ील्ड नाम है)
  • तोड़ने

मैं जानता हूँ कि क्यों इस आकर्षक था (मनमाना प्रकार के परिवहन के लिए WCF अनुमति देने के लिए), लेकिन मेरे शरीर में हर पेशी का कहना है कि यह एक शुद्ध हानि था। लोगों को अपने टूटे हुए वर्गों को काम करने की बजाय सही उपकरण (डेटा-अनुबंध) का उपयोग करना बेहतर होता है। मूल 3.0 में, बताए गए अपवाद को बताए गए थे कि आप इसे सही तरीके से कैसे ठीक करें: इसे [DataContract] के रूप में चिह्नित करें और बताएं कि [DataMember] एस आप क्रमबद्ध करना चाहते हैं।

यह भी देखें: Obfuscation, serialization and automatically implemented properties

+0

मुझे आपके साथ सहमत होना है - न केवल अभ्यास में यह परिवर्तन खराब है बल्कि "गलत" लगता है क्योंकि यह ऑप्ट-इन दर्शन के खिलाफ जाता है जो इतने लंबे समय से मौजूद है। –

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