একটি সম্পত্তি deserialize করা কিন্তু json.net দিয়ে সিরিয়ালাইজ করা হয় না


122

আমাদের কিছু কনফিগারেশন ফাইল রয়েছে যা জসন.নেটের সাথে সি # অবজেক্টকে সিরিয়ালাইজ করে তৈরি করা হয়েছিল।

আমরা সিরিয়ালযুক্ত শ্রেণীর একটি সম্পত্তি একটি সাধারণ এনাম সম্পত্তি থেকে শ্রেণির সম্পত্তিতে স্থানান্তরিত করতে চাই।

এটি করার একটি সহজ উপায় হ'ল ক্লাসে পুরানো এনাম সম্পত্তিটি ছেড়ে দেওয়া এবং আমরা যখন কনফিগারেশনটি লোড করব তখন জসন.নেট এই সম্পত্তিটি পড়ার ব্যবস্থা করবেন তবে আমরা পরেরটি অবজেক্টটি সিরিয়ালকরণ করার পরে এটি পুনরায় সংরক্ষণ না করব। আমরা পুরাতন এনাম থেকে পৃথকভাবে নতুন শ্রেণি তৈরির বিষয়টি মোকাবিলা করব।

কোনও সি # অবজেক্টের সম্পত্তি চিহ্নিতকরণের কোনও সহজ উপায় (উদাহরণস্বরূপ বৈশিষ্ট্য সহ) কী আছে, যাতে জসন.নাইট সিরিয়ালকরণের সময় কেবল এটিকে অগ্রাহ্য করবে, কিন্তু ডিসিরিয়ালাইজ করার সময় এতে উপস্থিত হবে?


একটি কাস্টম রূপান্তরকারী সম্পর্কে কী: আপনি এটিকে আপনার সম্পত্তির গুণাবলী হিসাবে ব্যবহার করতে পারেন, বিভিন্ন বিভাগের সাথে রিডজসন এবং রাইটজসনকে ওভাররাইড করতে পারেন, না? উদাহরণ (আপনার যা প্রয়োজন ঠিক তেমন নয়, তবে ...) ওয়েবলগস.এএসপিএন
আলথাস


`[JsonIgnore] 'বৈশিষ্ট্যটি ব্যবহার করা কি সম্ভব হবে না ?? james.newtonking.com/archive/2009/10/23/...
জুড়ী

কিউ এর শেষ অনুচ্ছেদ অনুযায়ী কীভাবে এটি কেবল এক দিকে ব্যবহার করা যেতে পারে তার প্রসারিত করতে পারবেন?
উইল ডিন

[জসনআইগনোর] একটি মাধ্যমিক বেসরকারী সেটারের সাথে একত্রে ব্যবহার করা সম্ভব যা একটি [জসনপ্রপার্টি] বৈশিষ্ট্য দ্বারা সজ্জিত। পাশাপাশি অন্যান্য কয়েকটি সহজ সমাধানও রয়েছে। আমি একটি বিস্তারিত লেখার যোগ করেছি।
ব্রায়ান রজার্স

উত্তর:


132

আপনার পছন্দসই ফলাফলটি অর্জন করতে আপনি বেশ কয়েকটি মোটামুটি সহজ পদ্ধতি ব্যবহার করতে পারেন।

ধরা যাক, উদাহরণস্বরূপ, আপনার ক্লাসগুলি বর্তমানে এটির মতো সংজ্ঞায়িত হয়েছে:

class Config
{
    public Fizz ObsoleteSetting { get; set; }
    public Bang ReplacementSetting { get; set; }
}

enum Fizz { Alpha, Beta, Gamma }

class Bang
{
    public string Value { get; set; }
}

এবং আপনি এটি করতে চান:

string json = @"{ ""ObsoleteSetting"" : ""Gamma"" }";

// deserialize
Config config = JsonConvert.DeserializeObject<Config>(json);

// migrate
config.ReplacementSetting = 
    new Bang { Value = config.ObsoleteSetting.ToString() };

// serialize
json = JsonConvert.SerializeObject(config);
Console.WriteLine(json);

এটি পেতে:

{"ReplacementSetting":{"Value":"Gamma"}}

পদ্ধতির 1: একটি হোল্ডসরিয়ালাইজ পদ্ধতি যুক্ত করুন

ক্লাসে সম্পর্কিত ShouldSerializeপদ্ধতিগুলি অনুসন্ধান করে শর্তসাপেক্ষে বৈশিষ্ট্যগুলি ক্রমিকায়িত করার ক্ষমতা জাসন.নেটের রয়েছে ।

এই বৈশিষ্ট্যটি ব্যবহার করতে, ShouldSerializeBlah()আপনার শ্রেণিতে একটি বুলিয়ান পদ্ধতি যুক্ত করুন যেখানে Blahআপনি যে সম্পত্তিটি সিরিয়াল করতে চান না তার নামের সাথে প্রতিস্থাপন করা হবে। এই পদ্ধতির প্রয়োগটি সর্বদা ফিরে আসুন false

class Config
{
    public Fizz ObsoleteSetting { get; set; }

    public Bang ReplacementSetting { get; set; }

    public bool ShouldSerializeObsoleteSetting()
    {
        return false;
    }
}

দ্রষ্টব্য: আপনি যদি এই পদ্ধতিটি পছন্দ করেন তবে কোনও ShouldSerializeপদ্ধতি প্রবর্তন করে আপনি নিজের শ্রেণীর পাবলিক ইন্টারফেসটিকে জঞ্জাল করতে চান না , আপনি IContractResolverপ্রোগ্রামটিকে একইভাবে এটি করতে ব্যবহার করতে পারেন । ডকুমেন্টেশনে শর্তাধীন সম্পত্তি সিরিয়ালাইজেশন দেখুন ।

পদ্ধতির 2: জেওবজেক্টগুলির সাথে জেএসওএনকে পরিচালনা করুন

JsonConvert.SerializeObjectসিরিয়ালাইজেশনটি ব্যবহার না করে কনফিগার বস্তুকে লোড করুন JObject, তারপরে অযাচিত সম্পত্তিটি লেখার আগে JSON থেকে সরান। এটি কোডের কয়েকটি অতিরিক্ত লাইন couple

JObject jo = JObject.FromObject(config);

// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();

json = jo.ToString();

পদ্ধতির 3: গুণাবলীর চালাক (আব) ব্যবহার

  1. [JsonIgnore]আপনি যে সম্পত্তিটি সিরিয়ালায়িত করতে চান না এমন কোনও বৈশিষ্ট্যে প্রয়োগ করুন ।
  2. ক্লাসে মূল সম্পত্তি হিসাবে একই ধরণের একটি বিকল্প, ব্যক্তিগত সম্পত্তি সেটার যুক্ত করুন। আসল সম্পত্তিটি সেট করে সেই সম্পত্তিটির বাস্তবায়ন করুন।
  3. [JsonProperty]আসল সম্পত্তি হিসাবে একই JSON নাম দিয়ে বিকল্প সেটারে একটি বৈশিষ্ট্য প্রয়োগ করুন ।

এখানে সংশোধিত Configশ্রেণি রয়েছে:

class Config
{
    [JsonIgnore]
    public Fizz ObsoleteSetting { get; set; }

    [JsonProperty("ObsoleteSetting")]
    private Fizz ObsoleteSettingAlternateSetter
    {
        // get is intentionally omitted here
        set { ObsoleteSetting = value; }
    }

    public Bang ReplacementSetting { get; set; }
}

7
অভ্যন্তরীণভাবে গেট-প্রোপার্টি সেট করে আমরা আমাদের প্রকল্পে এটি সমাধান করেছি (যা বেস মডেলের অভ্যন্তরীণ একীকরণ-নির্দিষ্ট সুপার সেট ব্যবহার করে, যেখানে সুপারক্লাসের কোনও বৈশিষ্ট্যই সিরিয়ালাইজ করা উচিত নয়), অভ্যন্তরীণভাবে গেট-প্রোপার্টি সেট করে। পাবলিক সেটটাররা ওয়েব অপিকে এই বৈশিষ্ট্যগুলি সেট করার অনুমতি দিয়েছিল, তবে সেগুলি ক্রমিকায়িত করা থেকে বিরত করেছে।
ড্যানিয়েল সাইদী

7
JsonPropertyAttributeসি # 6.0 এর সাথে ব্যবহার করে আপনি nameof"ম্যাজিক স্ট্রিং" ব্যবহার না করে কীওয়ার্ডটি ব্যবহার করতে পারেন । এটি রিফ্যাক্টরিংকে অনেক সহজ এবং মূর্খ-প্রমাণ করে তোলে - এছাড়াও, যদি আপনি কোনও ঘটনার নাম পরিবর্তন করে মিস করেন তবে সংকলক আপনাকে যাইহোক, সতর্ক করবে। @ ব্রায়ানের উদাহরণ ব্যবহার করে, ব্যবহারটি এরকম হবে:[JsonProperty(nameof(ObsoleteSetting))]
জেফ জেমস

1
জেসনপ্রপার্টি ঘোষণায় নামফ () ব্যবহার করা বিশেষত এই উত্তরাধিকারের দৃশ্যে খারাপ ধারণা। জেএসএন অন্য ইন্টারফেসের সাথে একটি বহিরাগত (এবং আশাকরি অনন্তকালীন) চুক্তির প্রতিনিধিত্ব করে, এবং আপনি যদি রিফ্যাক্টর করেন তবে আপনি অবশ্যই JSON সম্পত্তিটির নাম পরিবর্তন করতে চান না। আপনার এই সামঞ্জস্যতা ভঙ্গ হবে সমস্ত বিদ্যমান JSON ফাইল এবং উপাদানগুলি যা এই ফর্ম্যাটে JSON উত্পন্ন করে। প্রকৃতপক্ষে, আপনি পরে সম্পত্তিটির নাম পরিবর্তন করে রাখেন কিনা তা নিশ্চিত করার জন্য আপনি প্রতিটি সিরিয়ালযুক্ত সম্পত্তিতে পুরো নাম দিয়ে জসনপ্রোপার্টি (…) স্থাপন করা ভাল।
আম্মো গয়েটস্ক

36

আপনার deserialization- শুধুমাত্র সম্পত্তি অভ্যন্তরীণ চিহ্নিত করা গ্রহণযোগ্যতা যে কোনও পরিস্থিতিতে, একটি উল্লেখযোগ্য সহজ সমাধান যা বৈশিষ্ট্যের উপর মোটেও নির্ভর করে না। কেবল সম্পত্তিটি অভ্যন্তরীণ লাভ হিসাবে চিহ্নিত করুন, তবে পাবলিক সেট:

public class JsonTest {

    public string SomeProperty { internal get; set; }

}

এটির ফলে ডিফল্ট সেটিংস / সমাধানগুলি / ইত্যাদি ব্যবহার করে সঠিক deserialization হয় তবে সম্পত্তিটি সিরিয়ালযুক্ত আউটপুট থেকে ছিনিয়ে নেওয়া হয়।


সহজ কিন্তু চতুর সমাধান।
hbulens

যথাযথ নোট করুন যে সম্পত্তিটি বৈধতা মডিউল দ্বারাও উপেক্ষা করা হবে। (সুতরাং আপনি এটিকে deserialization করার জন্য [আবশ্যক] হিসাবে চিহ্নিত করতে পারবেন না, কারণ এটি একটি পাবলিক getপদ্ধতির উপর নির্ভর করে )।
মার্টিন হ্যানসেন

2
এটি উভয়ের সাথেও কাজ করে internalনা private। এটি সর্বদা সিরিয়ালযুক্ত হয়।
পল

এটি আমার পক্ষে কার্যকর হয়নি। ডিজিজারাইজ করার সময় কোনও সম্পত্তি ত্রুটি পাওয়া যায় নি।
ড্র সুমিডো

31

আমি এইটিতে গুণাবলীর সাথে লেগে থাকতে পছন্দ করি, এখানে কোনও পদ্ধতিটি ডিসায়ালাইজ করার প্রয়োজন হয় তবে এটির ক্রিয়াকলাপ বা তার বিপরীতে নয় I

পদক্ষেপ 1 - কাস্টম বৈশিষ্ট্য তৈরি করুন

public class JsonIgnoreSerializationAttribute : Attribute { }

পদক্ষেপ 2 - একটি কাস্টম চুক্তি রিস্লোভার তৈরি করুন

class JsonPropertiesResolver : DefaultContractResolver
{
    protected override List<MemberInfo> GetSerializableMembers(Type objectType)
    {
        //Return properties that do NOT have the JsonIgnoreSerializationAttribute
        return objectType.GetProperties()
                         .Where(pi => !Attribute.IsDefined(pi, typeof(JsonIgnoreSerializationAttribute)))
                         .ToList<MemberInfo>();
    }
}

পদক্ষেপ 3 - বৈশিষ্ট্য যুক্ত করুন যেখানে সিরিয়ালাইজেশন প্রয়োজন হয় না তবে deserialization হয়

    [JsonIgnoreSerialization]
    public string Prop1 { get; set; } //Will be skipped when serialized

    [JsonIgnoreSerialization]
    public string Prop2 { get; set; } //Also will be skipped when serialized

    public string Prop3 { get; set; } //Will not be skipped when serialized

পদক্ষেপ 4 - এটি ব্যবহার করুন

var sweet = JsonConvert.SerializeObject(myObj, new JsonSerializerSettings { ContractResolver = new JsonPropertiesResolver() });

আশাকরি এটা সাহায্য করবে! এছাড়াও এটি লক্ষণীয় যে ডেসরিয়ালাইজেশন ঘটে যখন এই বৈশিষ্ট্যগুলিকেও উপেক্ষা করবে, যখন আমি বিবর্ণকরণ করছি তখন আমি কেবল প্রচলিত উপায়ে রূপান্তরকারীটি ব্যবহার করি।

JsonConvert.DeserializeObject<MyType>(myString);

এই কার্যকর বাস্তবায়নের জন্য ধন্যবাদ। GetSerializableMembersসম্পূর্ণরূপে ওভাররাইড না করে বেস প্রয়োগ বাস্তবায়নের কোনও উপায় আছে কি ?
আলাইন

4
মাইন্ডমাইন্ড, ঠিক বুঝতে পেরেছি যে এটি এতটা সহজ:return base.GetSerializableMembers(objectType).Where(pi => !Attribute.IsDefined(pi, typeof(JsonIgnoreSerializationAttribute))).ToList();
আলাইন

নিশ্চিত নন কেন এটি শীর্ষ রেট করা উত্তর নয়। এটি পরিষ্কার, নিউটোনসফ্টের নিদর্শনগুলি অনুসরণ করে এবং করা সহজ। কেবলমাত্র আমি যুক্ত করব তা হ'ল আপনি এটি বিশ্বব্যাপী সেট আপ করতে পারেনJsonConvert.DefaultSettings = () => new JsonSerializerSettings { ContractResolver = new JsonPropertiesResolver() }
ম্যাট এম

1
কোন বিষয় নয়, এটি আসলে প্রশ্নকারী যা চাইবে তা করে না। এটি মূলত JsonIgnore পুনরুদ্ধার করছে। এটি সিরিয়ালাইজেশনের জন্য সম্পত্তিটি এড়িয়ে যায় না তবে ডিসাইরিয়ালেসনের সময় সম্পত্তি সেট করে কারণ গেটসিরাইজিয়েবল মেম্বার্স পদ্ধতিটি এটি কোনও পঠনযোগ্য বা রচনা কিনা তা জানার কোনও উপায় নেই তবে আপনি উভয়ের সম্পত্তি বাদ দিচ্ছেন। এই সমাধান কাজ করে না।
ম্যাট এম

7

সেটার সম্পত্তি ব্যবহার করুন:

[JsonProperty(nameof(IgnoreOnSerializing))]
public string IgnoreOnSerializingSetter { set { _ignoreOnSerializing = value; } }

[JsonIgnore]
private string _ignoreOnSerializing;

[JsonIgnore]
public string IgnoreOnSerializing
{
    get { return this._ignoreOnSerializing; }
    set { this._ignoreOnSerializing = value; }
}

এই সাহায্য আশা করি।


1
ধন্যবাদ। মনে রাখবেন যে জসনপ্রপার্টিটির IgnoreOnSerializingসম্পত্তি সমান একটি বড় হাতের অক্ষর থাকা উচিত । আমি nameof(IgnoreOnSerializing)পুনরায় নামকরণের ক্ষেত্রে যাদু স্ট্রিং এড়ানোর জন্য ব্যবহার করার পরামর্শ দিচ্ছি ।
বেনডিক আগস্ট নেস্বে

5

ডি-সিরিয়ালাইজেবল এবং নন সিরিয়ালাইজেবল হিসাবে কোনও শ্রেণীর সম্পত্তিটিকে কীভাবে পতাকাঙ্কিত করতে হবে তা অনুসন্ধান করার জন্য আমি দীর্ঘ সময় ব্যয় করার পরে আমি দেখতে পেলাম যে এমন করার মতো কোনও জিনিস নেই; সুতরাং আমি এমন একটি সমাধান নিয়ে এসেছি যা দুটি পৃথক গ্রন্থাগার বা সিরিয়ালাইজেশন কৌশল (সিস্টেম.রুনটাইম.সরিয়ালাইজেশন.জসন এবং নিউটনসফট.জসন) এর সাথে সংযুক্ত করে এবং এটি আমার জন্য নিম্নলিখিতগুলির মতো কাজ করেছে:

  • আপনার সমস্ত শ্রেণি এবং উপ-শ্রেণীগুলিকে "ডেটা চুক্তি" হিসাবে চিহ্নিত করুন।
  • আপনার শ্রেণি এবং উপ-শ্রেণীর সমস্ত বৈশিষ্ট্য "ডেটা মেম্বার" হিসাবে চিহ্নিত করুন।
  • আপনার শ্রেণি এবং উপ-শ্রেণীর সমস্ত বৈশিষ্ট্যকে "জসনপ্রোপার্টি" হিসাবে চিহ্নিত করুন, আপনি চান সেগুলি বাদে সিরিয়াল করা না হোক।
  • এখন আপনি যে বৈশিষ্ট্যগুলি এটি "জসনআইগনোর" হিসাবে সিরিয়ালায়িত করাতে চান না তা প্রত্যাখ্যান করুন।
  • তারপরে "নিউটনসফট.জসন.জসন কনভার্ট.সরিয়ালাইজ অবজেক্ট" ব্যবহার করে সিরিয়ালাইজ করুন এবং "সিস্টেম.রুনটাইম.সরিয়ালাইজেশন.জসন.ডাটা কন্ট্র্যাক্টজসন সিরিয়ালাইজার" ব্যবহার করে ডি-সিরিয়ালাইজ করুন।

    using System;
    using System.Collections.Generic;
    using Newtonsoft.Json;
    using System.Runtime.Serialization;
    using System.IO;
    using System.Runtime.Serialization.Json;
    using System.Text;
    
    namespace LUM_Win.model
    {
        [DataContract]
        public class User
        {
            public User() { }
            public User(String JSONObject)
            {
                MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(JSONObject));
                DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(User));
    
                User user = (User)dataContractJsonSerializer.ReadObject(stream);
                this.ID = user.ID;
                this.Country = user.Country;
                this.FirstName = user.FirstName;
                this.LastName = user.LastName;
                this.Nickname = user.Nickname;
                this.PhoneNumber = user.PhoneNumber;
                this.DisplayPicture = user.DisplayPicture;
                this.IsRegistred = user.IsRegistred;
                this.IsConfirmed = user.IsConfirmed;
                this.VerificationCode = user.VerificationCode;
                this.Meetings = user.Meetings;
            }
    
            [DataMember(Name = "_id")]
            [JsonProperty(PropertyName = "_id")]
            public String ID { get; set; }
    
            [DataMember(Name = "country")]
            [JsonProperty(PropertyName = "country")]
            public String Country { get; set; }
    
            [DataMember(Name = "firstname")]
            [JsonProperty(PropertyName = "firstname")]
            public String FirstName { get; set; }
    
            [DataMember(Name = "lastname")]
            [JsonProperty(PropertyName = "lastname")]
            public String LastName { get; set; }
    
            [DataMember(Name = "nickname")]
            [JsonProperty(PropertyName = "nickname")]
            public String Nickname { get; set; }
    
            [DataMember(Name = "number")]
            [JsonProperty(PropertyName = "number")]
            public String PhoneNumber { get; set; }
    
            [DataMember(Name = "thumbnail")]
            [JsonProperty(PropertyName = "thumbnail")]
            public String DisplayPicture { get; set; }
    
            [DataMember(Name = "registered")]
            [JsonProperty(PropertyName = "registered")]
            public bool IsRegistred { get; set; }
    
            [DataMember(Name = "confirmed")]
            [JsonProperty(PropertyName = "confirmed")]
            public bool IsConfirmed { get; set; }
    
            [JsonIgnore]
            [DataMember(Name = "verification_code")]
            public String VerificationCode { get; set; }
    
            [JsonIgnore]
            [DataMember(Name = "meeting_ids")]
            public List<Meeting> Meetings { get; set; }
    
            public String toJSONString()
            {
                return JsonConvert.SerializeObject(this, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore });
            }
        }
    }

আশা করি এইটি কাজ করবে ...


1
ব্রাভো আহমেদ আবুলাজম। ধন্যবাদ এটি আমাকে অনেক কাজ থেকে বাঁচিয়েছিল। :)
সাইক 12

2

@ থোহোর সমাধানের সাথে রেফারেন্সের সাথে, সেটার ব্যবহার করা আসলে কোনও অতিরিক্ত ট্যাগ ছাড়াই প্রয়োজনীয় সমস্ত কিছুই।

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

// Old property that I want to read from Json, but never write again. No getter.
public Guid RefId { set { RefIds.Add(value); } }

// New property that will be in use from now on. Both setter and getter.
public ICollection<Guid> RefIds { get; set; }

এই শ্রেণিটি এখন পূর্ববর্তী সংস্করণের সাথে পিছনে সামঞ্জস্যপূর্ণ এবং কেবলমাত্র নতুন সংস্করণগুলির জন্য রিফআইডস সংরক্ষণ করে ।


1

থো হো এর উত্তরের ভিত্তিতে এটি ক্ষেত্রগুলির জন্যও ব্যবহার করা যেতে পারে।

[JsonProperty(nameof(IgnoreOnSerializing))]
public string IgnoreOnSerializingSetter { set { IgnoreOnSerializing = value; } }

[JsonIgnore]
public string IgnoreOnSerializing;

1

অ্যাপ্লিকেশনটিতে এটি কোথায় সঞ্চালিত হয় এবং যদি এটি কেবল একটি সম্পত্তি হয় তবে তার উপর নির্ভর করে সম্পত্তির মানটি বাতিল করতে একটি ম্যানুয়াল উপায় এবং তারপরে মডেলটিতে আপনি উল্লেখ করতে পারেন যে মানটি বাতিল হলে সম্পত্তিটিকে উপেক্ষা করা হবে:

[JsonProperty(NullValueHandling = NullValue.Ignore)]
public string MyProperty { get; set; }

আপনি যদি একটি এএসপি.নেট কোর ওয়েব অ্যাপ্লিকেশনটিতে কাজ করছেন তবে আপনি আপনার স্টার্টআপের ফাইলগুলিতে এটি সেট করে বিশ্বব্যাপী সমস্ত মডেলের সমস্ত বৈশিষ্ট্যের জন্য এটি সেট করতে পারেন:

public void ConfigureServices(IServiceCollection services) {
    // other configuration here
    services.AddMvc()
        .AddJsonOptions(options => options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore);
}

0

আপনি যদি জসনকনভার্ট ব্যবহার করেন, তবে উপেক্ষা করুন ডেটা মেম্বারঅ্যাট্রিবিউট ঠিক আছে yআপনার স্ট্যান্ডার্ড লাইব্রেরি নিউটন.জসনকে রিফ্রেন্স করেন না এবং আমি অবজেক্ট সিরিয়ালিয়াস নিয়ন্ত্রণ করতে [IgnoreDataMember] ব্যবহার করি।

থেকে Newton.net সাহায্যের নথি।


0

কোনও সি # অবজেক্টের সম্পত্তি চিহ্নিতকরণের কোনও সহজ উপায় (উদাহরণস্বরূপ বৈশিষ্ট্য সহ) কী আছে, যাতে জসন.নাইট সিরিয়ালকরণের সময় কেবল এটিকে অগ্রাহ্য করবে, কিন্তু ডিসিরিয়ালাইজ করার সময় এতে উপস্থিত হবে?

এই লেখার মতো আমি সবচেয়ে সহজ উপায়টি হ'ল এই যুক্তিটি আপনার আইকন্ট্র্যাক্ট রিসোলভারে অন্তর্ভুক্ত করা ।

উপরের লিঙ্ক থেকে নমুনা কোড উত্তরসূরিদের জন্য এখানে অনুলিপি করা হয়েছে:

public class Employee
{
    public string Name { get; set; }
    public Employee Manager { get; set; }

    public bool ShouldSerializeManager()
    {
        // don't serialize the Manager property if an employee is their own manager
        return (Manager != this);
    }
}

public class ShouldSerializeContractResolver : DefaultContractResolver
{
    public new static readonly ShouldSerializeContractResolver Instance = new ShouldSerializeContractResolver();

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);

        if (property.DeclaringType == typeof(Employee) && property.PropertyName == "Manager")
        {
            property.ShouldSerialize =
                instance =>
                {
                    Employee e = (Employee)instance;
                    return e.Manager != e;
                };
        }

        return property;
    }
}

উত্তরগুলি সবই ভাল তবে এই পদ্ধতিটি দেখতে সবচেয়ে পরিষ্কার উপায় বলে মনে হয়েছিল। আমি আসলে এটিকে স্কিপরিশালাইজ এবং স্কিপডিজারালাইজের জন্য সম্পত্তিতে কোনও বৈশিষ্ট্য সন্ধান করে এটি বাস্তবায়ন করেছি যাতে আপনি যে কোনও শ্রেণীর দ্বারা নিয়ন্ত্রণ করা কেবলমাত্র চিহ্নিত করতে পারেন। দুর্দান্ত প্রশ্ন!

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