2011-06-07 20 views
5

के लिए प्रोटोबफ-नेट और मोनोटouch का उपयोग करके एक आईनेमेरेबल ट्रॉफ डब्ल्यूसीएफ को सीरियलाइज करना IOS के लिए मोनोटच/मोनोडेफ़ेफ़ पर डब्ल्यूसीएफ सेवा को कोड करने का प्रयास कर रहा हूं। मैं अपने इंटरफ़ेस के लिए मेरे serializable ऑब्जेक्ट और [ServiceContract]/[OperationContract] के लिए [DataMember]/[DataContract] जैसे मानक विशेषताओं का उपयोग कर रहा था। सबकुछ ठीक काम करता था, लेकिन जब मैंने इंटरफ़ेस कार्यान्वयन (सर्वर पक्ष) पर एक आईनेमरेबल लौटने की विधि को लागू करने का प्रयास किया, तो यह काम नहीं किया।आईओएस

तो मेरी समस्या को हल करने के लिए मैंने प्रोटोबफ-नेट के प्रोटोबफ-नेट v2 बीटा आर 404 के नवीनतम संस्करण का उपयोग करने का प्रयास किया। लेकिन मुझे अभी भी प्रोटोबफ-नेट से सीरियलाइजेशन त्रुटि मिल रही है। ध्यान दें कि "MyObject" में IENumerable बिना समस्या के serialize।

यहाँ कैसे मेरे कोड अभी दिखाई देता है:

MyObject:

[ProtoContract] 
public class MyObject 
{ 
    public MyObject() 
    { 
    } 

    [ProtoMember(1)] 
    public int Id {get;set;} 

    [ProtoMember(2)] 
    public IEnumerable<MyObject> myObjects {get;set;} 
} 

मेरे इंटरफेस (विंडोज पर सर्वर साइड):

[ServiceContract] 
public interface ITouchService 
{ 
     [OperationContract, ProtoBehavior] 
     MyObject Execute(); 

    [OperationContract, ProtoBehavior] 
    IEnumerable<MyObject> ExecuteENUM(); 
} 

मेरे इंटरफेस (आईओएस पर ग्राहक के पक्ष में, मैं ProtoBehavior को विशेषता के रूप में नहीं जोड़ सकता क्योंकि यह प्रोटोबफ के आईएसओ डीएल में नहीं है):

[ServiceContract] 
public interface ITouchService 
{ 
    [OperationContract] 
    MyObject Execute(); 

    [OperationContract] 
    IEnumerable<MyObject> ExecuteENUM(); 
} 

मेरे इंटरफेस कार्यान्वयन:

public class TouchService : ITouchService 
    { 
     public MyObject Execute() 
     { 
      var myObject = new MyObject() { Id = 9001 }; 

      var myList = new List<MyObject>(); 

      for (int i = 0; i < 10; i++) 
      { 
       myList.Add(new MyObject() { Id = i }); 
      } 

// Will serialize 
      myObject.myObjects = myList; 

      return myObject; 

     } 

     public IEnumerable<MyObject> ExecuteENUM() 
     { 
      var myEnum = new List<MyObject>(); 

      for (int i = 0; i < 10; i++) 
      { 
       myEnum.Add(new MyObject() { Id = i }); 
      } 

      return myEnum; 
     } 
    } 
+3

प्रोटोबग? मुझे थोड़ा लगता है: पी –

+0

क्षमा करें आदमी! 'जी' मेरे qwerty कीबोर्ड पर 'एफ' के पास है! –

+0

मैं शायद आईओएस बिल्ड में विशेषता शामिल कर सकता हूं - मैंने इसे मोनो टच पर डब्ल्यूसीएफ की स्थिति पर अनिश्चितता के कारण छोड़ दिया। अगर यह काम करता है, ठीक है ... –

उत्तर

2

मैं यह है कि के लिए डेटा अनुबंध serializer कोड में और सुधार करने के लिए संभव हो जाना चाहिए संदेह है। मैं एक नजर मार लूगां।

अभी के लिए: मेरी सलाह एक स्पष्ट ठोस प्रकार को वापस करना होगा जिसमें IEnumerable<T> एक संपत्ति के रूप में है। या शायद इसके बजाय List<T> लौटाएं, जो काम कर सकता है।

हालांकि, इस परिदृश्य का समर्थन करने के लिए उचित लगता है। में देखता हूँ में क्या कर सकता हूँ।