c# स्ट्रिंग के रूप में wcf deserialize enum




.net enums (4)

मैं WCF का उपयोग करते हुए एक निशुल्क वेब सेवा का उपयोग करने की कोशिश कर रहा हूं वेब सेवा के स्वरूप पर मेरे पास कोई नियंत्रण नहीं है, इसलिए मुझे यहां और वहां कुछ कामकाज करना पड़ता है। एक बड़ी समस्या यह है कि मैं चारों ओर नहीं जा सकता, हालांकि, WCF को एक स्ट्रिंग के रूप में एक एएनआईएम deserialize कैसे करना है।

यह मेरा कोड है (नाम बदला हुआ है, जाहिर है):

[DataContract]
public enum Foo
{
    [EnumMember( Value = "bar" )]
    Bar,

    [EnumMember( Value = "baz" )]
    Baz
}

[DataContract]
public class UNameIt
{
    [DataMember( Name = "id" )]
    public long Id { get; private set; }

    [DataMember( Name = "name" )]
    public string Name { get; private set; }

    [DataMember( Name = "foo" )]
    public Foo Foo { get; private set; }
}

और ये वापस आ गया डेटा है जो deserialization को विफल करता है:

{
     "id":123456,
     "name":"John Doe",
     "foo":"bar"
}

अंत में, अपवाद फेंका गया:

प्रकार के ऑब्जेक्ट के लिए deserializing त्रुटि थी। Foo मूल्य 'बार' को 'Int64' प्रकार के रूप में पार्स नहीं किया जा सकता है

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

मैं WCF (या, अच्छी तरह से, डेटा कंट्रेक्ट सेरियलाइज़र) स्ट्रिंग मानों के रूप में अपने एंमान को कैसे व्यवहार करूं?

संपादित करें : ऐसा करना असंभव लगता है, और व्यवहार वह तरीका है जो डिज़ाइन द्वारा होता है। आपको माइक्रोसॉफ्ट का धन्यवाद, हमें विकल्प न देने के लिए, हैक्स का सहारा लेना। इसे जिस तरह से सोमोरी बताता है, उसे JSON और WCF के साथ स्ट्रिंग एंमान प्राप्त करने का एकमात्र तरीका लगता है।


मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मुझे लगता है कि यह उल्लेख के लायक है।

मुझे एक समान त्रुटि मिली, जहां पर जेएसएसएन स्ट्रिंग के deserialization विफल हुआ, जो कि गलत प्रकारों के लिए deserialize लग रहा था।

मेरे लिए यह तय करना था कि यूआरएल को सर्वर पर भेजने से पहले जेएसएन स्ट्रिंग को सांकेतिक शब्दों में बदलना चाहिए। बनाने के लिए एक सरल लेकिन आसान गलती

HttpUtility.UrlEncode(JSONInstruction) /*remember to encode the string*/

यह एक मूर्ख प्रश्न हो सकता है

यदि आप करते हैं तो क्या होता है

[DataMember( Name = "foo" )]
private string foo { get; private set; }

public Foo Foo 
{ 
  get 
  {
    return Foo.Parse(foo);
  }
}

?


यह शायद हो रहा है क्योंकि सेटर निजी है और रिपोर्ट की गई त्रुटि गुमराह कर रही है। फू पहली संपत्ति है जिसे deserialized किया जा सकता है और जब से कोई सार्वजनिक सेटर उपलब्ध नहीं है, तो यह एक अपवाद फेंकता है






datacontractserializer