나는 일반적으로 클래스가 몇 가지 이유로 직렬화하는 방법을 알지 못하게합니다. 먼저 다른 형식으로 (직렬화) 직렬화하려는 경우 이제 해당 추가 논리로 모델을 오염시켜야합니다. 인터페이스를 통해 모델에 액세스하면 계약도 오염시킵니다.
public class Image
{
public void toJPG(String filePath) { ... }
public Image fromJPG(String filePath) { ... }
}
그러나 PNG 및 GIF와 직렬화하려면 어떻게해야합니까? 이제 수업은
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);
}
}
이미지에는 일반적으로 메타 데이터가 포함되어 있으므로 일반적인 예입니다. 압축 수준, 색 공간 등이 프로세스를 복잡하게 만들 수 있습니다.