সিরিয়ালাইজেশন এবং deserialization ক্লাসিকৃত সিরিয়াল করা দায়বদ্ধ হওয়া উচিত?


16

আমি বর্তমানে সি # .NET অ্যাপ্লিকেশনটির কয়েকটি মডেল ক্লাসের (পুনরায়) নকশার পর্যায়ে আছি। (এমভিসি এম এর মতো মডেল)। মডেল ক্লাসে ইতিমধ্যে প্রচুর পরিমাণে সু-নকশিত ডেটা, আচরণ এবং আন্তঃসম্পর্ক রয়েছে। আমি পাইথন থেকে সি # তে মডেলটি আবার লিখছি।

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

  • Imageএকটি .toJPG(String filePath) .fromJPG(String filePath)পদ্ধতি সহ ক্লাস
  • ImageMetaDataএকটি .toString()এবং .fromString(String serialized)পদ্ধতি সহ বর্গ ।

আপনি কল্পনা করতে পারেন কীভাবে এই সিরিয়ালাইজেশন পদ্ধতিগুলি ক্লাসের বাকী অংশগুলির সাথে একত্রে নয়, তবুও কেবল শ্রেণিকেই নিজেকে সিরিয়ালায়িত করার জন্য পর্যাপ্ত তথ্য জানার গ্যারান্টি দেওয়া যেতে পারে।

কীভাবে কোনও শ্রেণীর পক্ষে কীভাবে নিজেকে সিরিয়ালিয়াল করা এবং ডিজিটালাইজ করা যায় তা জানার জন্য কি সাধারণ অনুশীলন? বা আমি একটি সাধারণ প্যাটার্ন অনুপস্থিত?

উত্তর:


16

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

public class Image
{
    public void toJPG(String filePath) { ... }

    public Image fromJPG(String filePath) { ... }
}

তবে আপনি যদি কোনও পিএনজি এবং জিআইএফ / থেকে এটি সিরিয়ালায়িত করতে চান তবে কী হবে? এখন ক্লাস হয়ে যায়

public class Image
{
    public void toJPG(String filePath) { ... }

    public Image fromJPG(String filePath) { ... }

    public void toPNG(String filePath) { ... }

    public Image fromPNG(String filePath) { ... }

    public void toGIF(String filePath) { ... }

    public Image fromGIF(String filePath) { ... }
}

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

public interface ImageSerializer
{
    void serialize(Image src, Stream outputStream);

    Image deserialize(Stream inputStream);
}

public class JPGImageSerializer : ImageSerializer
{
    public void serialize(Image src, Stream outputStream) { ... }

    public Image deserialize(Stream inputStream) { ... }
}

public class PNGImageSerializer : ImageSerializer
{
    public void serialize(Image src, Stream outputStream) { ... }

    public Image deserialize(Stream inputStream) { ... }
}

public class GIFImageSerializer : ImageSerializer
{
    public void serialize(Image src, Stream outputStream) { ... }

    public Image deserialize(Stream inputStream) { ... }
}

এখন, এই মুহুর্তে, এই ডিজাইনের সাহায্যে একটি সতর্কতা হ'ল সিরিয়ালাইজারদের যে জিনিসটি সিরিয়ালায়িত করছে সেটির বিষয়টি জানতে identityহবে। কিছু বলবেন যে এটি খারাপ নকশা, কারণ বাস্তবায়ন ক্লাসের বাইরে ফাঁস হয়। এর ঝুঁকি / পুরষ্কারটি সত্যিই আপনার উপর নির্ভর করে তবে আপনি কিছু ভালো করার জন্য ক্লাসগুলিকে সামান্য সামঞ্জস্য করতে পারেন

public class Image
{
    public void serializeTo(ImageSerializer serializer, Stream outputStream)
    {
        serializer.serialize(this.pixelData, outputStream);
    }

    public void deserializeFrom(ImageSerializer serializer, Stream inputStream)
    {
        this.pixelData = serializer.deserialize(inputStream);
    }
}

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


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

খুব ভাল পয়েন্ট। আমি সে সম্পর্কে ভাবছিলাম, তবে একটি মস্তিষ্কের আবরণ ছিল। আমি কোড আপডেট করব।
জিমাস

আমি ধরে নিয়েছি যে আরও সিরিয়ালাইজেশন ফর্ম্যাটগুলি সমর্থিত (যেমন ImageSerializerইন্টারফেসের আরও বাস্তবায়ন লিখিত হয়), ImageSerializerইন্টারফেসটিও বাড়তে হবে। EX: একটি নতুন ফর্ম্যাট optionচ্ছিক সংকোচনের সমর্থন করে, পূর্ববর্তীগুলি তা করেনি -> ImageSerializerইন্টারফেসে সংকোচনের কনফিগারেশন যুক্ত করে । তবে অন্য ফর্ম্যাটগুলি এমন বৈশিষ্ট্যগুলির সাথে বিশৃঙ্খলাযুক্ত হয় যা সেগুলিতে প্রযোজ্য নয়। আমি এটি সম্পর্কে যত বেশি চিন্তা করি, এখানে উত্তরাধিকারের পরিমাণ কম প্রয়োগ হবে বলে আমি মনে করি।
kdbanman

আপনি কোথায় থেকে এসেছেন তা বুঝতে পেরে আমি বেশ কয়েকটি কারণে এটি কোনও সমস্যা নয় বলে মনে করি। যদি এটি বিদ্যমান চিত্রের ফর্ম্যাট হয় তবে সম্ভাবনা হ'ল সিরিয়ালাইজার ইতিমধ্যে কমপ্রেসনের স্তরগুলি কীভাবে মোকাবেলা করতে জানে এবং যদি এটি নতুন হয় তবে আপনাকে এটি লিখতে হবে। একটি সমাধান হ'ল পদ্ধতিগুলি ওভারলোড করা, void serialize(Image image, Stream outputStream, SerializerSettings settings);এরপরে এটি বিদ্যমান পদ্ধতিটি নতুন পদ্ধতিতে সংক্ষেপণ এবং মেটাডেটা যুক্তিকে সরিয়ে দেওয়ার মাত্র একটি ঘটনা।
জিমাস

3

ক্রমিকায়ন দুটি অংশের সমস্যা:

  1. কোনও শ্রেণি ওরফে কাঠামো কীভাবে ইনস্ট্যান্ট করবেন সে সম্পর্কে জ্ঞান ।
  2. কিভাবে জিদ / তথ্য যে একটি শ্রেণী instantiate প্রয়োজন হয় স্থানান্তর সম্পর্কে জ্ঞান বলবিজ্ঞান ওরফে

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

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

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


1
কীভাবে এই দুটি জিনিসকে ডুপ্লুপ করা যায় তার একটি উদাহরণ আপনি দিতে পারেন? আমি নিশ্চিত না যে আমি পার্থক্যটি বুঝতে পেরেছি।
kdbanman
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.