가끔은 ObjectOutputStream
을 사용하여 파일에 내용을 쓰거나 네트워크를 통해 작은 이미지를 보내려고합니다. 그러나 BufferedImage
과 많은 다른 클래스들은 java.io.Serializable
을 구현하지 못하고 Stream은 쓰기를 취소합니다. 그 방법을 피할 수 있습니까?Java : 직렬화 가능하지 않고 ObjectOutputStream 사용
감사합니다, 마티, 말처럼
가끔은 ObjectOutputStream
을 사용하여 파일에 내용을 쓰거나 네트워크를 통해 작은 이미지를 보내려고합니다. 그러나 BufferedImage
과 많은 다른 클래스들은 java.io.Serializable
을 구현하지 못하고 Stream은 쓰기를 취소합니다. 그 방법을 피할 수 있습니까?Java : 직렬화 가능하지 않고 ObjectOutputStream 사용
감사합니다, 마티, 말처럼
객체 만 는 스트림에 기록 할 수 있습니다.
그러나 javax.imageio
의 클래스 중 하나를 사용하여 모든이를 방지 할 수있다. 특히 ImageIO.write(RenderedImage, String, OutputStream)
메서드는 BufferedImage
이 RenderedImage
을 구현하기 때문에 발생합니다. 그런 다음 ImageIO.read(InputStream)
으로 다시 읽을 수 있으며 BufferedImage
을 반환합니다.
다른 OutputSteam
유형을 원할 수도 있습니다. 보통 OutputStream
에 추가로 몇 가지 특별한 ImageOutputStream
이 있습니다.
편집 : , 당신은 가다가 다른 직렬화 메커니즘을 사용하는 ImageIO.getWriterFormatNames()
호 "나는 텍스트로 객체를 표시하기를 원하지만 문자열로 변환하는 방법에 대해 아무것도 몰라."
Serializable
의 모든 목적은 "내가 스트림으로 직렬화하는 방법을 알고 있습니다."라고 말합니다. - 우리가 그것을 필요로하지 않는다면 우리는 그것을 갖지 못할 것입니다. 당신이 손으로 직렬화의 몇 가지 방법을 작동 수있는 Serializable
를 구현하지만 하지이 Serializable
을 구현하지 자체가 뭔가를 포함 객체 있지만, 어떤이있는 경우
지금, 당신은 항상 자신을 객체 컨테이너의 직렬화를 사용자 정의 할 수 있습니다 .
기본적으로 ObjectOutputStream
은 Java 직렬화 프레임 워크 용으로 설계되었습니다. 직렬화 프레임 워크를 사용하지 않으려면 ObjectOutputStream
을 사용하지 마십시오. 이미지는 특히 ImageIO
이 처리 할 수있는 자체 "원시 형식"을 가질 가능성이 있습니다 (R. Bemrose가 언급 한대로).
ObjectOutputStream 서브 클래스를 작성하고 enableReplaceObject를 호출 한 다음 replaceObject (Object)를 대체하십시오. 당신은 또한 아마도 companion ObjectInputStream 서브 클래스가 resolveObject (Object)를 오버라이드하여 동일한 작업을 수행 할 필요가있을 것이다. 것은 java.io.Serializable 인터페이스를 지원
그것은 옵션이 될 수 있습니다 호출 할 수있는 중간 인수에 대한 유효한 문자열 목록을 얻으려면 :이 전에 놓쳤다. JBoss Serialization은 직렬화 형식이 다르므로 독자와 작성자 모두 동일한 메커니즘을 사용해야하지만 표준 java.io 직렬화의 드롭 인 대체품입니다.
JBoss 직렬화는 클래스가 java.io.Serializable
을 구현하도록 요구하지 않지만 명시 적으로 직렬화 가능하지 않은 경우 해당 개체가 프로세스를 통과 할 것이라는 보장은 없습니다.
직렬화 할 수없는 개체를 처리하는 한 가지 방법은 단순히 건너 뜁니다.ObjectOutputStream를 확장하고 객체가 직렬화 가능한지 확인하는 replaceObject 메소드를 구현할 수 있습니다.
public class MyOOS extends ObjectOutputStream {
public MyOOS(OutputStream out) throws IOException {
super(out);
enableReplaceObject(true);
}
@Override
protected Object replaceObject(Object obj) throws IOException {
if ((obj instanceof Serializable))
return obj;
System.err.println("Skipping serialization of "+obj);
return null;
}
}
멋진 캐치 – skaffman