c# - डेटाकंट्रैक्ट अपवाद। धारावाहिक नहीं किया जा सकता है




.net wcf (4)

आपको अपने डेटाकंट्रैक्ट क्लास में खाली पैरामीटर कन्स्ट्रक्टर जोड़ना चाहिए

मेरे पास निम्नलिखित डब्ल्यूसीएफ डाटाकंट्रैक्ट है:

[DataContract]
public class Occupant
{
    private string _Name;
    private string _Email;
    private string _Organization;
    private string _Badge;

    public Occupant(string name, string badge, string organization)
    {
        Name = name;
        Badge = badge;
        Organization = organization;
    }

    public Occupant(string name, string badge)
    {
        Value = name;
        Key = badge;
    }

    [DataMember]
    public string Key
    {
        get { return _Name; }
        set { _Name = value; }
    }

    [DataMember]
    public string Value
    {
        get { return _Badge; }
        set { _Badge = value; }
    }

    [DataMember]
    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }

    [DataMember]
    public string Email
    {
        get { return _Email; }
        set { _Email = value; }
    }

    [DataMember]
    public string Organization
    {
        get { return _Organization; }
        set { _Organization = value; }
    }

    [DataMember]
    public string Badge
    {
        get { return _Badge; }
        set { _Badge = value; }
    }
}

जब मैं वेब ब्राउज़र के माध्यम से इस सेवा तक पहुंचने का प्रयास करता हूं (यह आईआईएस पर होस्ट किया जाता है), मुझे यह त्रुटि मिल रही है:

System.Runtime.Serialization.InvalidDataContractException: 'MyNamespace.Occupant' टाइप करें को क्रमबद्ध नहीं किया जा सकता है। DataContractAttribute विशेषता के साथ इसे चिह्नित करने पर विचार करें, और अपने सभी सदस्यों को चिह्नित करना जिन्हें आप DataMemberAttribute विशेषता के साथ क्रमबद्ध करना चाहते हैं। यदि प्रकार एक संग्रह है, तो इसे CollectionDataContractAttribute के साथ चिह्नित करने पर विचार करें।

मेरी विधियों में से एक व्यवसाय प्रकार की List लौट रहा है। क्या यह इसका कारण होगा?


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

/// <summary>
/// parameterless default constructor only for serialization
/// </summary>
public MyClass() { throw new NotImplementedException("parameterless default constructor only for serialization"); }

चूंकि आपने एक या अधिक प्रारंभिक कन्स्ट्रक्टर प्रदान किए हैं, इसलिए आपको पैरामीटर रहित (डिफ़ॉल्ट) कन्स्ट्रक्टर भी जोड़ना होगा।

यानी आपको जोड़ने की जरूरत है:

[DataContract]
public class Occupant
{
    // *** Needed only for Serialization
    public Occupant() {}
    ...

ऐसा इसलिए है क्योंकि जब आप एक स्पष्ट कन्स्ट्रक्टर जोड़ते हैं तो डिफ़ॉल्ट कन्स्ट्रक्टर गायब हो जाता है।

[यह समस्या List<Occupant> लौटने की विधि के साथ नहीं है, क्योंकि विधियों को क्रमबद्ध नहीं किया गया है)।]


मेरा अनुमान होगा क्योंकि _Email प्रारंभ नहीं हुआ है। आप EmitDefaultValue को false सेट कर सकते हैं और देख सकते हैं कि इससे मदद मिलती है:

[DataMember(EmitDefaultValue = false)]
public string Email
{






wcf