2011-08-05 12 views
5

हमारे पास बहुत सारी कक्षाओं के साथ एक बड़ा आवेदन है। वर्तमान में हम मोनोटच के साथ आईपैड में इस .NET एप्लिकेशन को पोर्ट कर रहे हैं। हमें DataContractSerializer के साथ कुछ समस्याएं हैं और हम मार्क ग्रेवेल के प्रोटोबफ-नेट सीरियलाइज़र का उपयोग करना चाहते हैं।डब्लूसीएफ डेटाकंट्रैक्ट सेरियलाइज़र से प्रोटोबफ-नेट पर सही ढंग से माइग्रेट कैसे करें?

क्लाइंट और सर्वर के बीच संचार एक डब्ल्यूसीएफ सेवा द्वारा प्रबंधित किया जाता है।

एक डब्ल्यूसीएफ सेवा क्लाइंट और सर्वर के सामने एक इंटरफेस से बना है, और सर्वर पर इस इंटरफ़ेस का एक कार्यान्वयन है।

इंटरफ़ेस की तरह दिखता है:

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    SomeObject MyFunction(SomeObject myObject); 
} 

सर्वर साइड कार्यान्वयन कि तरह लग रहा है:

[ServiceBehavior(...)] 
public class MyService 
{ 
    public SomeObject MyFunction(SomeObject myObject) 
    { 
    } 
} 

हमारी कक्षाएं कि तरह लग रहा है:

[DataContract] 
public class MyClass 
{ 
    [DataMember] 
    public int SomeProp {get; set;} 

    [OnSerialized] 
    public void OnSerialized(StreamingContext context) 
    { 
    } 
} 

तो यहाँ मेरी सवाल कर रहे हैं :

  • मेरी कक्षाओं, डब्ल्यूसीएफ इंटरफेस और डब्ल्यूसीएफ कार्यान्वयन में क्या बदलाव होगा।

  • मैं डिफ़ॉल्ट डब्लूसीएफ डेटाकंट्रैक्टसाइराइज़र को प्रोटोबफ सीरियलाइज़र में कैसे बदलूं।

कृपया ध्यान दें, monotouch पर कि मैं केवल Protobuf और Protobuf.Meta नामस्थान की पहुंच है। Custom WCF DataContractSerializer

ऊपर समाधान DataContractSerializerOperationBehavior उपयोग करता है:

[संपादित करें] मैं serializer क्रम स्वैप करने के लिए एक रास्ता मिल गया। प्रोटोबफ-नेट ऐसा व्यवहार प्रदान करता है?

+0

दूसरा क्या मार्क ने कहा: ऐसा न मानें कि आप एमएस .NET पर serializer को स्वैप कर सकते हैं कि आप इसे मोनो में कर सकते हैं, मोनो टच के साथ चलो। मोनो का डब्ल्यूसीएफ स्टैक अपरिपक्व है और एमटी केवल उस से एक सबसेट लागू करता है ... – TheNextman

उत्तर

2

सभी ईमानदारी से, मैं आपके लिए उपलब्ध डब्ल्यूसीएफ विकल्पों से अपरिचित हूं; वे नियमित रूप से .NET और Silvelight के बीच बहुत अलग हैं, उदाहरण के लिए - और मुझे यह मानने का कोई कारण नहीं है कि मोनोटouch में रनटाइम पर धारावाहिक को स्वैप करने की क्षमता है (जो "पूर्ण" .NET कम से कम एमएस संस्करण के तहत करता है)। इससे चुपचाप संक्रमण करना मुश्किल हो जाता है, क्योंकि हम DataContractSerializer से नियंत्रण कुश्ती नहीं कर सकते हैं।

इस प्रकार, आईएमओ सबसे आसान विकल्प डेटा को मैन्युअल रूप से नियंत्रित करने के लिए है, और कच्चे byte[] भेजें - आदर्श रूप से एमटीओएम एन्कोडिंग सक्षम है यदि मोनोटच ऐसा कर सकता है। फिर एक बार जब आपके पास byte[] हो, तो दुनिया आपका मॉलस्क है, जैसा कि वे कहते हैं।

आपके प्रकारों में बदलाव ... अच्छी तरह से, MyFunction() एक विषमता है, जिसमें यह किसी भी डेटा को स्थानांतरित नहीं करता है, इसलिए मुझे यकीन नहीं है कि आप मुझे उस पर सुझाव देना चाहते हैं। MyClass के साथ, इसकी आवश्यकता एक प्रति अद्वितीय संख्या है (प्रति प्रकार अद्वितीय, वैश्विक स्तर पर नहीं) प्रति सदस्य, यानी।

[DataContract] 
public class MyClass 
{ 
    [DataMember(Order=1)] // <==== this provides the 1 as the key 
    public int SomeProp {get; set;} 

    // see below re callback 
} 

आपके पास एक क्रमबद्ध कॉलबैक भी है; ये पूरी तरह से समर्थित हैं, लेकिन यह एक परिचित पैटर्न खोजने की अपेक्षा करता है - StreamContext वह नहीं है जिसे मैं जानता हूं (हालांकि इसे StreamingContext और कुछ अन्य लोगों के साथ काम करना चाहिए)।

अंत में, ध्यान दें कि डिफ़ॉल्ट प्रोटोबफ-नेट कन्स्ट्रक्टर निष्पादित करता है, जो DataContractSerializer से अलग है। यदि आप चाहें, तो आप इसे दबा सकते हैं:

[DataContract(SkipConstructor=true)] 
public class MyClass {...} 

यदि मुझे यहां इरादा याद आया है, तो मुझे बताएं।

ध्यान दें कि यदि आप चाहें तो किसी भी विशेषता को बदलने/जोड़ने के बिना सभी कॉन्फ़िगरेशन करने के तरीके भी हैं।

+0

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

+0

और मैं किसी भी विशेषता को बदलने के बिना कॉन्फ़िगरेशन कैसे करूं? –

+0

@ जीन - बाद के प्रश्न फिर से; "v2" में 'RuntimeTypeModel' है जो सबकुछ कॉन्फ़िगर करने की अनुमति देता है। पहले रे - कोर सीरिएलाइज़र को प्रतिस्थापित किए बिना (जिसे आप एमएस पूर्ण .NET में कर सकते हैं)। इसलिए एपीआई पर मूल वस्तु के रूप में 'बाइट []' का उपयोग करने के लिए मेरा सुझाव, ताकि हम धारावाहिक * को * के बाहर नियंत्रित कर सकें। पूर्ण .NET के रूप में सुविधाजनक नहीं, मैं सहमत हूं। बेशक, उस बिंदु पर आप सोच सकते हैं कि डब्ल्यूसीएफ आपके लिए क्या जोड़ रहा है .... शायद कच्चे सॉकेट या HTTP पोस्ट आसान है। –