ডাব্লুসিএফ কোনও "সেট" নেই এমন সম্পত্তিগুলিতে চাপ দেয়। কোন কাজ?


98

আমার কিছু শ্রেণি রয়েছে যা আমি কোনও পরিষেবার পদ্ধতির ফলাফল হিসাবে পাস করছি, এবং সেই শ্রেণীর একমাত্র-প্রাপ্ত সম্পত্তি রয়েছে:

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

আমি পরিষেবা পক্ষ থেকে একটি ব্যতিক্রম পাচ্ছি:

সিস্টেম.রুনটাইম.সরিয়ালাইজেশন.অনুষ্ঠানিক ডেটা কনট্রাক্ট এক্সেপশন: 'মাইনেমস্পেস.এররব্যাস' টাইপ করে সম্পত্তি 'ম্যাসেজ' এর জন্য কোনও সেট পদ্ধতি নেই।

আমার কাছে এই সম্পত্তিটি কেবল গেটার হিসাবে থাকতে হবে, আমি ব্যবহারকারীদের এটিকে কোনও মূল্য নির্ধারণ করতে দিতে পারি না। আমি ব্যবহার করতে পারে কোন workaround? বা আমি কিছু অতিরিক্ত বৈশিষ্ট্য মিস করছি?

উত্তর:


109

বার্তাটিকে একটি পাবলিক গেটর কিন্তু সুরক্ষিত সেটার দিন, যাতে কেবলমাত্র সাবক্লাস (এবং ডেটা কন্ট্র্যাক্টস্রায়ালাইজার, কারণ এটি চিট করে :) মানটি পরিবর্তন করতে পারে।


এটি একটি ঝরঝরে সমাধান!
রাসেল

ধন্যবাদ, খুশী এটি কার্যকর ছিল! এটি আসলে এই কৌশলটির জন্য বেশ কয়েকটি ব্যবহারের মধ্যে একটি। যেহেতু গিটার এবং সেটটারগুলি প্রযুক্তিগতভাবে কাজ করে, তাই আপনি ভয়ঙ্কর IDataContractSurrogate চালানোর প্রয়োজন ছাড়াই আদিম ধরণের (সম্ভবত এক্সএমএলে একটি কাস্টম টাইম ফর্ম্যাট) কাস্টম সিরিয়ালাইজেশন সরবরাহ করতে এই একই কৌশলটি ব্যবহার করতে পারেন।
আরএইচ।

29
এমনকি আপনি এটি ব্যক্তিগতও করতে পারেন। সিরিয়ালাইজার এটি ব্যক্তিগত, পাবলিক, সুরক্ষিত, অভ্যন্তরীণ বা সুরক্ষিত অভ্যন্তরীণ কিনা তা বিবেচনা করে না।
আবেল

8
এবং throw new NotSupportedException()
সেটারটি

4
একটি হচ্ছে private set;কাজ করে আপনি ব্যবহার [DataContract]এবং [DataMember]। আপনি যদি এগুলি বাদ দেন তবে আপনার প্রয়োজন public set;
ব্যবহারকারী 276648

12

এমনকি যদি আপনাকে মানটি আপডেট করার প্রয়োজন না হয় তবে ডাব্লুসিএফএসেরাইজার দ্বারা সেটারটি অবজেক্টটি ডিসরিয়ালাইজ করতে ব্যবহার করে (এবং মানটি পুনরায় সেট করে)।

এই এসও হ'ল আপনি যা করছেন তার পরে: ডাব্লুসিএফ ডেটা চুক্তি


4
সুতরাং সমস্যাটি কাটিয়ে ওঠার একমাত্র উপায় হ'ল সম্পত্তির পরিবর্তে কোনও পদ্ধতি তৈরি করা? আবার, আমি এই সম্পত্তিটিতে "সেট" করতে পারছি না
আন্দ্রে

আপনি এটিকে একটি পদ্ধতিতে তৈরি করতে পারেন (যেমন গেটম্যাসেজ () {রিটার্ন "";}) বিকল্পভাবে, আমি নিশ্চিত যে আপনি ডাব্লুসিএফ সিরিয়ালাইজারকে এটিকে অবহেলা করতে বলতে পারেন। আমি যা খুঁজে পেতে পারি তা দেখতে এবং আপনাকে জানাতে পারি,,
রাসেল

4
এই স্ট্যাকওভারফ্লো প্রশ্নটি মাথায় পেরেকটি আঘাত করে: stackoverflow.com/questions/172681/wcf-datacontracts
রাসেল


5

আপনার কাছে যদি কেবলমাত্র একজন গেটর থাকে তবে কেন আপনার সম্পত্তিটি মোটেই ক্রমিক করা দরকার। দেখে মনে হচ্ছে আপনি কেবলমাত্র পঠনযোগ্য বৈশিষ্ট্যের জন্য ডেটা মেম্বার বৈশিষ্ট্যটি সরিয়ে ফেলতে পারেন, এবং সিরিয়ালাইজার কেবল সম্পত্তিটিকে উপেক্ষা করবে।


4
একটি উত্সাহিত সম্পত্তি (উদাহরণস্বরূপ, একটি আইডি সম্পত্তি থেকে গণনা করা হয় এমন একটি ইউআরএল সম্পত্তি) ক্রমাগত স্টোরেজ (উদাহরণস্বরূপ, একটি ডাটাবেস) - এটির জন্য উত্সাহিত করার জন্য এটি সত্যিকার অর্থে বোঝা যায় না - তবে এটির জন্য এটির ক্রমিকায়িত করার কোনও মানে হয় না উপস্থাপনা (যেমন, JSON বা এক্সএমএল) যা একটি এপিআই অনুরোধ দ্বারা ফিরে আসে।
ফ্লোরিয়ান শীতকাল

4

আপনি কি শুধু "ডু-কিছুই" সেটার রাখতে পারবেন না ??

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

বা ডেটা কন্ট্রাক্ট সিরিয়ালাইজার বারফ কি এটিও ??


14
এটি বাধা দেয় না, আমি কেবল ক্লায়েন্ট এপিআই ব্যবহার করে বিকাশকারীদের মনে করতে পারি না যে তারা সম্পত্তিটিতে জিনিস বরাদ্দ করতে পারে।
অ্যান্ড্রে 18

2

ডেটা মেম্বার বৈশিষ্ট্যযুক্ত বৈশিষ্ট্যগুলির জন্য সর্বদা সেট প্রয়োজন। আপনার ক্লায়েন্ট অ্যাপ্লিকেশনটিতে সিমিলার অবজেক্টটি আবার লিখতে হবে যেহেতু ডেটা কন্ট্র্যাক্ট সদস্যদের সর্বদা মান নির্ধারিত করা যায়।


2

এএসপি.নেট এমভিসি এবং জেএসওএন আউটপুটটিতে আইটেমগুলির নামগুলি নিয়ন্ত্রণ করতে সক্ষম হতে আমি ডেটা কন্ট্র্যাক্টসরিশালাইজারটি ব্যবহার করতে চাই এবং আমার এই সমস্যাটি ছিল। অবশেষে আমি JSON.NET, যা (যা DataContractSerializer না) এবং setters ছাড়া বৈশিষ্ট্য সমর্থন সম্পত্তি নাম নিয়ন্ত্রণ (যা ASP.NET MVC মধ্যে serializer বিল্ট-ইন তাদেরকে JSON না) মাধ্যমে করার serializer সুইচড [JsonProperty(PropertyName = "myName")]


2

যদি এটি একটি কার্যকর বিকল্প হয়, তবে ErrorBaseবেস ক্লাস হিসাবে না থাকার পরিবর্তে এটি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করুন:

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

            // leave unattributed
            set;
        }
    }

এখন, যদিও কোনও সেটার উপস্থিত রয়েছে, এটি ক্লায়েন্টের কাছে ডাব্লুসিএফ চ্যানেলের মাধ্যমে অ্যাক্সেসযোগ্য, সুতরাং এটি ব্যক্তিগত হিসাবে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.