Ich vermeide es im Allgemeinen aus mehreren Gründen, dass die Klasse weiß, wie sie sich selbst serialisiert. Wenn Sie ein anderes Format (de) serialisieren möchten, müssen Sie das Modell jetzt mit dieser zusätzlichen Logik belasten. Wird auf das Modell über eine Schnittstelle zugegriffen, verschmutzen Sie auch den Vertrag.
public class Image
{
public void toJPG(String filePath) { ... }
public Image fromJPG(String filePath) { ... }
}
Aber was ist, wenn Sie es zu / von einem PNG und GIF serialisieren möchten? Jetzt wird die Klasse
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) { ... }
}
Stattdessen verwende ich normalerweise gerne ein Muster, das dem folgenden ähnelt:
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) { ... }
}
Zu diesem Zeitpunkt besteht eine der Einschränkungen bei diesem Entwurf darin, dass die Serialisierer wissen müssen, welches identity
Objekt serialisiert wird. Einige würden sagen, dass dies ein schlechtes Design ist, da die Implementierung außerhalb der Klasse leckt. Das Risiko / die Belohnung dafür liegt in der Tat bei Ihnen, aber Sie können die Klassen leicht anpassen, um so etwas wie zu tun
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);
}
}
Dies ist eher ein allgemeines Beispiel, da Bilder normalerweise Metadaten haben, die damit einhergehen. Dinge wie Komprimierungsgrad, Farbraum usw., die den Prozess erschweren können.