আমি ক্লাসে নিজেকে বেশ কয়েকটি কারণে কীভাবে সিরিয়ালায়িত করতে হয় তা জানার বিষয়টি এড়িয়ে চলি। প্রথমত, আপনি যদি (ডি) আলাদা বিন্যাসে / থেকে সিরিয়ালাইজ করতে চান, আপনাকে এখন সেই অতিরিক্ত যুক্তি দিয়ে মডেলটিকে দূষিত করতে হবে। যদি কোনও ইন্টারফেসের মাধ্যমে যদি মডেলটি অ্যাক্সেস করা হয় তবে আপনি চুক্তিকেও দূষিত করেন।
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);
}
}
এটি আরও সাধারণ উদাহরণ, কারণ চিত্রগুলির সাধারণত মেটাডেটা থাকে যা এর সাথে চলে; সংকোচনের স্তর, কালারস্পেস ইত্যাদির মতো জিনিসগুলি প্রক্রিয়াটিকে জটিল করে তুলতে পারে।