ডেসিরিয়ালাইজ করার সময় কীভাবে জেসন থেকে কে__ব্যাকিংফিল্ড সরান


104

একটি। নেট সি # অবজেক্টে একটি এক্সএমএল ফাইল সিরিয়ালাইজ করার পরে আমি আমার ফিরে জেএসনে কে_ব্যাকিংফিল্ড পাচ্ছি।

আমি। নেট সি # অবজেক্টে ডেটা কনট্র্যাক্ট এবং ডেটা মেম্বার অ্যাট্রিবিউট যুক্ত করেছি তবে তারপরে আমি ক্লায়েন্টের শেষের জেএসন-তে কিছুই পাই না।

[XmlRoot("person")]
[Serializable]
public class LinkedIn
{
    [XmlElement("id")]
    public string ID { get; set; }

    [XmlElement("industry")]
    public string Industry { get; set; }

    [XmlElement("first-name")]
    public string FirstName { get; set; }

    [XmlElement("last-name")]
    public string LastName { get; set; }
    [XmlElement("headline")]
}

ফিরে আসা জসন এর উদাহরণ:

home: Object
<FirstName>k__BackingField: "Storefront"
<LastName>k__BackingField: "Doors"

উত্তর:


45

শ্রেণি সিরিয়ালায়নে ব্যবহৃত হতে পারলে স্বয়ংক্রিয়ভাবে সম্পত্তি সিনট্যাক্সের প্রস্তাব দেওয়া হয় না। ব্যাকিং ফিল্ড হওয়ার কারণটি কম্পাইলার দ্বারা উত্পন্ন হয় যা প্রতিটি সময় সংকলিত কোডের চেয়ে আলাদা হতে পারে। ক্লাসে কোনও পরিবর্তন না করা হলেও (কেবল কোডটি পুনরায় সংশোধন করা) এটি অসঙ্গতিজনিত সমস্যাগুলির কারণ হতে পারে।

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


Lol, দীর্ঘ সংস্করণ বাস্তবায়িত এবং এটি client.home ব্যক্তিগত ক্ষেত্র সেট নয়: অবজেক্ট _fName: "দোকানে ঢোকার মুখে" _headline: "প্রধান নির্বাহী কর্মকর্তা StorefrontDoors.NET এ" _id: "" _industry: ""
স্ট্যাক ভরাট আমি কি হয়

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

3
[ডেটাঅন্ট্র্যাক্ট] এবং [ডেটা মেম্বার] এর জন্য @ অ্যালামক্লাউড.কম +1। যোগ করতে ভুলবেন না: সিস্টেম.আরুনটাইম.সিরিয়ালাইজেশন
ইয়ান নিউল্যান্ড

109

[Serializable]আপনার ক্লাস থেকে সরান


2
এখন আমি ভাবছি কেন আমি কেন প্রথম স্থানে আমার [সিরিয়ালাইজযোগ্য] প্রয়োজন বলে মনে করি? আমার এক্সএমএল সিরিয়ালাইজেশন ছাড়া কাজ করে এবং জেএসএন এটি ছাড়া কাজ করে।
রাইয়াস

11
এটি ডাব্লুসিএফ পরিষেবাগুলির সাথে কাজ করে না। RESTful পরিষেবাদি ব্যবহার করে পে-লোড ফেরত দেওয়ার সময় আপনি যদি [সিরিয়ালাইজযোগ্য] সরিয়ে ফেলেন তবে এতে কোনও ডেটা পাওয়া যায় না। সিস্টেম যুক্ত করুন time রুনটাইম.সিরিয়ালাইজেশন এবং শ্রেণীর জন্য [ডেটা কন্ট্র্যাক্ট], বৈশিষ্ট্যগুলির জন্য [ডেটা মেম্বার] ব্যবহার করুন।
ইয়ান নিউল্যান্ড

এই উত্তর এবং ইয়ান মন্তব্য উভয় কেস কভার বলে মনে হচ্ছে। ডাব্লুসিএফের কাছে না ডাব্লুসিএফের কাছে, এটাই প্রশ্ন।
গ্রানাডা কোডার

1
@ রাইয়াস - ওয়েব এপিআইতে আপনার [সিরিয়ালাইজযোগ্য] দরকার নেই, কারণ ওয়েব এপিআই সেটআপ করা হয়েছে এমন ধারণা নিয়ে যা আপনি নিজের বস্তুগুলিকে সিরিয়ালাইজ করতে এবং ফিরিয়ে আনতে চলেছেন (যেহেতু এটি মূলত সম্পূর্ণ ধারণা) - অন্যান্য সি # অ্যাপ্লিকেশনগুলিতে আপনি সাধারণত সিরিয়ালাইজযোগ্য অবজেক্টগুলিকে আলাদা করার জন্য সিরিয়ালাইজেবলের প্রয়োজন
জোন স্টোরি

আপনাকে ধন্যবাদ, আমি আটকে ছিলাম [Serializable], তাই ব্যাকিং ক্ষেত্রগুলি যুক্ত করা সহায়তা করেছিল।
ওহুমসামায়

59

ডিফল্ট ওয়েবএপিআই সিরিয়ালাইজার সেই "__ব্যাকিংফিল্ড:" সি # অটো-বৈশিষ্ট্যে সিনট্যাক্স যুক্ত করবে। আপনি খুঁজছেন এমন ক্লিনার ক্লিনিক জেসন পেতে এটি অ্যাপ_সার্টটিতে আপনার ওয়েবকনফিগটিতে যুক্ত করুন।

using Newtonsoft.Json;
...

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();

3
এটি সমস্যার সমাধান করেছে। আমি মনে করি অটো বৈশিষ্ট্যগুলি পরিষ্কার। ব্যাকিং ফিল্ডগুলি সর্বত্র ব্যবহার করা বোকা বলে মনে হচ্ছে। এবং প্রচুর গোলমাল এবং কখনও কখনও বিভ্রান্তির পরিচয় দেয়।
রোমশ ডি। নিরিলা 9'16

এটি আমার পক্ষে কাজ করেছে। আমার ক্ষেত্রে, আমার একটি বিদ্যমান ক্লাস ছিল যা ইতিমধ্যে ডাব্লুসিএফ এবং এএসএমএক্স ওয়েবসার্ভেস ব্যবহার করছিল, তাই আমি কেবল আমার নতুন ওয়েবএপিআই প্রকল্পের জন্য এটি পরিবর্তন করতে পারিনি।
সামিওপ

4
প্রশ্ন হল পৃথিবীতে ওয়েবএপিআই সিরিয়ালাইজার কেন ডিফল্টরূপে "__BackingFeld:" যুক্ত করবে?
তেওমান শিপাহী

ভাল সমাধান। আমার ক্ষেত্রে, আমাকে [সিরিয়ালাইজযোগ্য] মেমক্যাশে সংরক্ষণ করতে হবে। সিরিয়ালাইজযোগ্য প্রয়োজন।
B Nnh Nguyễn Quang

2
স্ট্যাক ওভারফ্লো ছাড়া আমি কী করব? ধন্যবাদ।
camainc

35

আমাদের কাছে কিছু অবজেক্ট রয়েছে যা চিহ্নিত করা হয়েছে [Serializable]যাতে তারা traditionalতিহ্যগত পদ্ধতি ব্যবহার করে সিরিয়ালায়িত করা যায় তবে ওয়েব এপিআই দিয়ে ব্যবহারের জন্য আমাদের জেএসএনে পরিষ্কারভাবে সিরিয়ালাইজড করা দরকার। সেট IgnoreSerializableAttributeকরা trueনিউটোনসফট.জসনকে মাইক্রোসফ্টের সিরিয়ালিয়াসদের মতো আচরণ করা থেকে বিরত করবে এবং এর পরিবর্তে এটি জনসাধারণের সম্পত্তিগুলিকে কেবল সিরিয়ালাইজ করবে।

টিএলডিআর: এটি ওয়েবএপিসিফিগ.সি.এস এ যুক্ত করুন:

((Newtonsoft.Json.Serialization.DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true;

মডারেটর: বেশ কয়েকবার জিজ্ঞাসা করা প্রশ্নটির সত্যই উত্তরের উত্তর মোছার পরিবর্তে, দয়া করে সদৃশ প্রশ্নটি মুছুন। এটি একটি বৈধ প্রশ্নের বৈধ উত্তর।


3
এটি সঠিক উত্তর হওয়া উচিত। সিরিয়ালাইজেশন অপসারণ বা ডেটা কন্ট্রাক্ট এবং ডেটােমবারের বৈশিষ্ট্যগুলি ব্যবহার করা সর্বদা সঠিক সমাধান নয়।
হৌসাম হামদান

ওপি সহ আমরা অনেকেই ওয়েবপি বা এমভিভিএম ব্যবহার করি না বা আপনি যেগুলি সম্পর্কে যা করছেন তা প্রায় নয়। আমার যখন পরিষেবা .svc সহ একটি সাধারণ সাবান ডাব্লুসিএফ পরিষেবা থাকে তখন অ্যাপ_স্টার্ট এবং ওয়েবপিকনফিগ কী?
খ্রিস্টান

10

ডেটা উন্মোচন করার সহজ সহজ এবং শালীন উপায় আমাদের অবজেক্টে সহজ পাঠযোগ্য এবং ধারাবাহিক বিন্যাসে ডেটা প্রকাশ করতে হবে


প্রথমে সরানো [সিরিয়ালাইজযোগ্য]

    [Serializable]

এখনই যোগ [DataContract] ক্লাসে এবং [DataMember] উদাহরণস্বরূপ সম্পত্তি জন্য নিচের মত

[DataContract]
public class UserDiscretion : UserReport
{
    [DataMember]
    public String DiscretionCode { get; set; }
    public String DiscretionDescription { get; set; }
}

আশা করি এই সাহায্য
ধন্যবাদ


1
যদি ওয়েব এপিআই ব্যবহার করে থাকে তবে ডেটা কন্ট্রাক্ট এবং ডেটা মেম্বার বৈশিষ্ট্যগুলি যুক্ত করার দরকার নেই - কেবলমাত্র বস্তুটি ফিরিয়ে দিন এবং এটি স্বয়ংক্রিয়ভাবে সিরিয়ালায়িত হবে।
জন গল্প

যদি কেউ স্ক্র্যাচ থেকে ডেভলপমেন্ট শুরু করে তাই ওয়েব এপিআই ব্যবহার করা দুর্দান্ত হবে যা অবজেক্ট রিটার্ন টাইপ সরবরাহ করবে এমন ক্লায়েন্টের কাছে প্রকাশের জন্য কোনও ধরণের টাইপ কাস্টিংয়ের প্রয়োজন হবে না। তবে @ অ্যালামক্লাউড ডটকম প্রশ্নের জন্য, যদি তিনি বিদ্যমান প্রয়োগে থাকেন তবে তার সমস্যার সমাধান হবে প্রথমে [সিরিয়ালাইজযোগ্য] অপসারণের মাধ্যমে ক্লাসে [ডেটা কনট্র্যাক্ট] এবং [ডেটা মেম্বার] নীচের মতো সম্পত্তি হিসাবে যুক্ত হিসাবে যুক্ত করুন
নাগেন্দ্র উপওয়ানশি

1
এটি আপনার ক্লাসগুলিতে একটি বিশাল পরিমাণ "শব্দ" যোগ করে এবং মূলত অপ্রয়োজনীয় (অন্যান্য সমস্ত মন্তব্য দেখুন)। যদি কেউ আসলে এটি করার প্রয়োজন অনুভব করে তবে, আমি সংকলনের সময় আপনার জন্য কোড যুক্ত করার জন্য পোস্টশার্পের মতো কিছু ব্যবহার করার পরামর্শ দিচ্ছি যাতে এটি সমস্ত বৈশিষ্ট্যের সাথে আপনার ক্লাসগুলি গুঁড়িয়ে না দেয়।
camainc

7

কয়েকটি বিকল্প:

  1. [Serializable]মডেল থেকে সরান

  2. যোগ [DataContract]এবং [DataMember]সহ আপনার মডেলের [Serializable]

  3. নীচে লাইন যুক্ত করুন App_Start/WebApiConfig.cs

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();

3

JSON.NET এর ক্ষেত্রে সহায়তা করতে পারে এমন আরও একটি সমাধান। [নিউটনসফট.জসন.জসনঅজেক্ট] বৈশিষ্ট্য সহ শ্রেণি চিহ্নিত করা যথেষ্ট।

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


2

আমি DataContractJsonSerializerঅন্য সমাবেশ থেকে এমন একটি শ্রেণীর সাথে ব্যবহার করছিলাম যার Serializableবৈশিষ্ট্যটি ছিল । আউটপুটটিতে "কে__ব্যাকিংফিল্ড" রয়েছে। Serializableবৈশিষ্ট্য অপসারণ (অন্যান্য সমাবেশে) এটি স্থির করেছে। নিশ্চিত কেন।


0

ধরে নিলাম আপনি আপনার এমভিসি প্রকল্পের ভিতরে এই সমস্যাটি দেখতে পাচ্ছেন, আমি খুঁজে পেয়েছি যে @ এইচটিএমএল.জসোনডাটার ব্যবহারটি প্রতিস্থাপন করা বেশ সহজ। এখানে কোডের স্নিপেট যা আমার জন্য অতীতে কাজ করেছে:

<input type="hidden" id="Model" value="@Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model))" />

চিমটি হিসাবে মার্জিত নয়, সহজ।


0

আমার ক্লাসে যেমন স্ব-রেফারেন্স বৈশিষ্ট্য রয়েছে তখন আমার এই সমস্যাটি ছিল;

class Person {
 List<Person> Friends { get; set;}
}

এবং একটি ফলাফল ছিল, ব্যক্তিটি নিজের সাথে বন্ধু ছিল was আমি কেবল নিশ্চিত করেছি যে আমার ফলাফল সেটে কোনও স্ব-রেফারেন্সিং অবজেক্ট নেই। আশাকরি এটা সাহায্য করবে.


0

আমাকে [সিরিয়ালাইজযোগ্য] বৈশিষ্ট্যগুলি ব্যবহার করতে হয়েছিল, সুতরাং এটিকে অপসারণ করা কোনও বিকল্প ছিল না।

এক্সএমএসআরশায়ালাইজার ওয়েবপিপিতে [এক্সএমএলঅ্যাট্রিবিউট] উপেক্ষা করে

উপরের রেজোলিউশনটি আমার জন্য এটি সমাধান করেছে।

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

0

আমার ক্ষেত্রে এই ত্রুটিটি নিউটনসফট.জসন সংস্করণটির জন্য ছিল, সার্ভারটি 6.0.0 সংস্করণটির সন্ধান করেছে এবং আমার কাছে 11.0 ছিল, সুতরাং আমি 6.0.0 সংস্করণটি ইনস্টল করতে হয়েছিল


-2

বন্ধুরা, এই জাতীয় সম্পত্তি ঘোষণা করবেন না:

public String DiscretionCode { get; set; }
public String DiscretionDescription { get; set; }

তবে, পুরনোদের মতো সহায়ক ভার্সেস তৈরি করুন ...

private String discretionCode;

public String DiscretionCode 
{ 
    get { return discretionCode;}
    set { discretionCode = value; }
}

1
কেন? আপনি একটি অনুরণন দিতে পারেন?
লুয়েন্টি

@ লুসিটি এটি সিরিয়ালাইজ করার সময় এটির মতো একটি জেএসএন দেয় [[{"বিচক্ষণ কোড": "এক্স"।],।
আম্মার আমিরদিন

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

একটি অটো-প্রপার্টি সিরিয়ালীকৃত হয়েছে তা বোঝাতে কে_ব্যাকিংফিল্ড যুক্ত করা হয়েছে। আপনি যদি কোনও সম্পত্তি এবং কোনও ব্যাকিং ফিল্ডে অটো-প্রপার্টি রিফ্যাক্টর করেন তবে সমস্যাটি চলে যাবে। আমি মনে করি এই থ্রেডে আরও ভাল সমাধান আছে তবে এটি কাজ করে।
টিএমবি 33
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.