সেটার ব্যতীত সম্পত্তিগুলি কেন ক্রমিক নয়


103

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

[Serializable]
public class Example
{
    [XmlAttribute("id")]
    public string Id
    {
        get
        {
             return Guid.NewGuid().ToString();
        }
    }
}

আমি একটি খালি সেটার বাস্তবায়নের চেষ্টা করেছি এবং এটি সঠিকভাবে সিরিয়ালযুক্ত হয়েছে।

[Serializable]
public class Example
{
    [XmlAttribute("id")]
    public string Id
    {
        get
        {
             return Guid.NewGuid().ToString();
        }
        set {}
    }
}

আপডেট :

আপনি কী উল্লেখ করতে পারেন যে আমি কীভাবে এমন বৈশিষ্ট্যগুলি সংজ্ঞায়িত করব যাগুলির মানগুলি কখনই পরিবর্তন হয় না বা যার মূল্য অভ্যন্তরীণভাবে উত্পন্ন হয়?


4
দ্বিতীয় উদাহরণটি সঠিকভাবে সিরিয়ালাইজ করুন ... তবে আপনি যখন এটির ডিজিটালাইজ করার চেষ্টা করবেন তখন কী হবে?
লাইটস্ট্রাইকার

YAXLib [+ , + ] ব্যবহার করে দেখুন
সিনা ইরাভানিয়ান

4
এফওয়াইআই, এক্সএমএল সিরিয়ালাইজার উপেক্ষা করে [Serializable]
জন স্যান্ডার্স

পছন্দ করেছেন
কনস্ট্যান্টিন দিনভ

উত্তর:


61

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

বিকল্পভাবে আপনি ডেটা কন্ট্র্যাক্টস্রায়ালাইজার ব্যবহার করতে স্যুইচ করতে পারেন , এটি আরও নমনীয়।


8
ডেটা কন্ট্র্যাক্টসরিয়ালাইজারেরও সেটটার প্রয়োজন। এটি একটি সীমাবদ্ধতা কারণ যদিও আমরা এটি কেবলমাত্র এক ধরণের অপারেশনের জন্য ব্যবহার করতে পারি, ডিসেরায়ালাইজেশন বলি, তবে ঘোষণাপত্র দুটির জন্যই হওয়া দরকার, সিরিয়ালাইজেশন প্রক্রিয়া যখন কোনও সিরিয়াল দেওয়ার চেষ্টা করা হয় তখন কোনও মান দিয়ে কী করা উচিত তা জানতে পারে না an এক্সএমএল অবজেক্টে।
ryadavilli

7
@ryadavilli হিসাবে চিহ্নিত চিহ্নিত যেকোন কিছুই [DataMember]সিরিয়ালাইজড DataContractSerializer(কেবল পঠনযোগ্য বা না) ব্যবহার করে তৈরি করা হয়েছে।
জেমস

4
@ জেমস আমি উপরেরটি লিখেছি কারণ যখন আমি একই চেষ্টা করেছি তখন কিছু সংকলন সময় ত্রুটি পেয়েছিলাম। এখন, যখন আমি আমার কোডটিতে ফিরে এসে সেটারটি সরিয়ে ফেললাম, মনে হচ্ছে এটি জরিমানা সংকলন করছে। এটি আমার কাছে আরও গবেষণার জন্য অত্যন্ত জঘন্য এবং সম্ভবত হোমওয়ার্ক।
ryadavilli

4
আহ্ অবশেষে আমার বিভ্রান্তির উত্স খুঁজে পেল। সিরিয়ালাইজেশনের জন্য কোনও সম্পত্তি সেটার প্রয়োজন হয় না। যাইহোক, যদি কোনও সম্পত্তির সেটার না থাকে তবে এক্সএমএল কোনও অবজেক্টের deserialize করবে না। সেখানে হোমওয়ার্ক শেষ।
রায়দিল্লি

4
@ রিয়াডিল্লি হ্যাঁ, এটি XmlSerializerবাস্তবায়নের সীমাবদ্ধতা মাত্র , এটি পাবলিক সেটার পদ্ধতিতে নির্ভর করে। DataContractSerializerএই অর্থে কিছুটা চালাক (সম্ভবত পর্দার পিছনে ক্ষেত্র সেট করার জন্য প্রতিচ্ছবি ব্যবহার করে)।
জেমস

10

এমএসডিএন ডকুমেন্টেশনে " এক্সএমএল সিরিয়ালাইজেশন উপস্থাপন করা " দেখুন । অন্যান্য বিষয়ের মধ্যে এটি বলে:

আইটেমগুলি সিরিয়াল করা যেতে পারে

নিম্নলিখিত আইটেমগুলি এক্সএমএসআরশায়ালার শ্রেণি ব্যবহার করে ক্রমিক করা যেতে পারে:

Public read/write properties and fields of public classes.

Classes that implement ICollection or IEnumerable.

বিঃদ্রঃ:

Only collections are serialized, not public properties.
XmlElement objects.

XmlNode objects.

DataSet objects.

এছাড়াও, " এক্সএমএল-সিরিয়ালাইজযোগ্য শ্রেণীর কেন প্যারামিটারলেস কনস্ট্রাক্টরের প্রয়োজন " দেখুন


এছাড়াও, আইএক্সএমএলসিরাইজেবল

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

" IXMLSerializable ইন্টারফেস " দেখুন।


6

সীমাবদ্ধতা XMLSerializer - সেটার ব্যতীত সম্পত্তিগুলি ক্রমিকায়িত করা যায় না।

তবে আপনি DataContractSerializerসিরিয়ালাইজ করতে ব্যবহার করতে পারেন private setter properties-

[DataMember]
public string Id
{
    get
    {
         return Guid.NewGuid().ToString();
    }
    private set {}
}

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

2

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


0

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

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