Saya biasanya menghindari kelas yang tahu bagaimana membuat cerita bersambung sendiri, karena beberapa alasan. Pertama, jika Anda ingin (de) membuat serial ke / dari format yang berbeda, Anda sekarang harus mencemari model dengan logika ekstra itu. Jika model diakses melalui antarmuka, maka Anda juga mencemari kontrak.
public class Image
{
public void toJPG(String filePath) { ... }
public Image fromJPG(String filePath) { ... }
}
Tetapi bagaimana jika Anda ingin membuat cerita bersambung ke / dari PNG, dan GIF? Sekarang kelas menjadi
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) { ... }
}
Sebagai gantinya, saya biasanya suka menggunakan pola yang mirip dengan yang berikut:
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) { ... }
}
Sekarang, pada titik ini, salah satu peringatan dengan desain ini adalah bahwa serializers perlu mengetahui identity
objek yang diserialisasi. Beberapa orang akan mengatakan bahwa ini adalah desain yang buruk, karena implementasinya bocor di luar kelas. Risiko / imbalan dari ini benar-benar terserah Anda, tetapi Anda dapat sedikit mengubah kelas untuk melakukan sesuatu seperti
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);
}
}
Ini lebih merupakan contoh umum, karena gambar biasanya memiliki metadata yang sejalan dengannya; hal-hal seperti tingkat kompresi, ruang warna, dll. yang dapat mempersulit proses.