Genellikle birkaç nedenden dolayı sınıfın kendini nasıl serileştireceğini bilmesini önlerim. İlk olarak, farklı bir formata / seriden serileştirmek istiyorsanız, şimdi modeli bu ekstra mantıkla kirletmeniz gerekir. Modele bir arayüz aracılığıyla erişilirse, sözleşmeyi de kirletirsiniz.
public class Image
{
public void toJPG(String filePath) { ... }
public Image fromJPG(String filePath) { ... }
}
Peki bir PNG ve GIF'e / serisinden serileştirmek isterseniz ne olur? Şimdi sınıf
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) { ... }
}
Bunun yerine, genellikle aşağıdakine benzer bir desen kullanmayı seviyorum:
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) { ... }
}
Şimdi, bu noktada, bu tasarıma sahip uyarılardan biri, serileştiricilerin serileştirdiği identity
nesneyi bilmeleri gerektiğidir . Bazıları, uygulamanın sınıfın dışına sızması nedeniyle bunun kötü bir tasarım olduğunu söyleyebilir. Bunun riski / ödülü gerçekten size kalmış, ancak böyle bir şey yapmak için sınıfları biraz değiştirebilirsiniz.
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);
}
}
Bu daha genel bir örnektir, çünkü görüntüler genellikle onunla birlikte gelen meta verilere sahiptir; Sıkıştırma seviyesi, renk aralığı vb.