c# - डब्ल्यूसीएफ बिना किसी "सेट" वाले गुणों पर चोक करता है। कोई कामकाज?




wcf properties (6)

मेरे पास कुछ वर्ग है जो मैं एक सेवा विधि के परिणामस्वरूप गुजर रहा हूं, और उस वर्ग में केवल एकमात्र संपत्ति है:

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message { get { return ""; } }
}

मुझे सेवा पक्ष पर अपवाद मिल रहा है:

System.Runtime.Serialization.InvalidDataContractException: 'MyNamespace.ErrorBase' प्रकार में 'संदेश' के लिए कोई सेट विधि नहीं है।

मुझे यह संपत्ति केवल गेटटर के रूप में रखना है, मैं उपयोगकर्ताओं को इसे एक मान निर्दिष्ट करने की अनुमति नहीं दे सकता। कोई भी कामकाज मैं उपयोग कर सकता था? या क्या मुझे कुछ अतिरिक्त विशेषता याद आ रही है?


क्या आपके पास अभी "डू-कुछ नहीं" सेटटर नहीं हो सकता है ??

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message 
  {
      get { return ""; } 
      set { }
  }
}

या उस पर DataContract serializer barf भी करता है ??


डेटामेम्बर विशेषता वाले गुणों को हमेशा सेट की आवश्यकता होती है। आपको क्लाइंट एप्लिकेशन पर समान वस्तु लिखनी चाहिए क्योंकि डेटाकंट्रैक्ट सदस्यों को हमेशा मान असाइन किया जा सकता है।


यदि आपके पास केवल गेटटर है, तो आपको संपत्ति को क्रमबद्ध करने की आवश्यकता क्यों है। ऐसा लगता है कि आप केवल पढ़ने योग्य संपत्ति के लिए डेटामेम्बर विशेषता को हटा सकते हैं, और सीरिएलाइज़र केवल संपत्ति को अनदेखा कर देगा।


यदि यह एक व्यवहार्य विकल्प है, तो ErrorBase रूप में ErrorBase होने के बजाय, इसे निम्नानुसार परिभाषित करें:

    public interface IError
    {
        string Message
        {
            [OperationContract]
            get;

            // leave unattributed
            set;
        }
    }

अब, भले ही एक सेटर मौजूद है, यह डब्ल्यूसीएफ चैनल के माध्यम से क्लाइंट के लिए पहुंच योग्य नहीं है, इसलिए ऐसा लगता है कि यह निजी था।


संदेश को एक सार्वजनिक गेटर लेकिन संरक्षित सेटटर दें, ताकि केवल उप-वर्ग (और डेटाकंट्रैक्टसेरियलाइज़र, क्योंकि यह धोखा देती है :) मूल्य को संशोधित कर सकता है।


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




datacontractserializer