2010-08-23 4 views
2

메시지를 serialization을 사용하여 파일에 쓰려고합니다. 메시지는 날짜와 TibrvMsg (TibrvMsg은 Tibco의 고유 메시지이며이 클래스는 해당 문서에 따라 직렬화 할 수 없습니다.) 메시지는 다음과 같습니다 TibrvMsg가 직렬화 아니므로 내가 Message Serializable를 선언하고 있지만java serialization

Message msg = new Message(TibrvMsg msg) 

문제는, 나는 그것을 직렬화 할 수 없습니다입니다. 그래서 java.io.NotSerializableException: com.tibco.tibrv.TibrvMsg 예외가 발생합니다.

+0

더 명확하게 수 있도록 코드를 게시하시기 바랍니다 –

답변

1

TibrvMsg를 직렬화 가능 객체로 나타내는 방법을 찾아야합니다 (지도로 변환하는 like this 일 수 있습니다).

그런 다음 출력 스트림에 데이터를 쓰기 (또는 읽기)하려면 다음 두 가지 방법을 재정의 할 수

private void writeObject(java.io.ObjectOutputStream out) 
    throws IOException{ 
    out.writeObject(date); 
    out.writeObject(doSomethingWithTibrv(tibrv); 
} 

private void readObject(java.io.ObjectInputStream in) 
    throws IOException, ClassNotFoundException{ 
    date = (Date) in.readObject(); 
    tibrv = readTibrv(in.readObject()); 
} 
+0

감사합니다. 나는 똑같은 일을하고 있습니다. 그러나 프로그램 예외를 throw합니다. 하나의 옵션은 TibrvMsg에서 다양한 분야를 얻는 것입니다 메시지에 첨부 한 다음 메시지를 파일에 씁니다. – user420760

+0

무슨 예외입니까? – Thilo

+0

java.io.NotSerializableException : com.tibco.tibrv.TibrvMsg TibrvMsg에는 키 값 쌍이 포함되어 있습니다. TibrvMsg는 키 값 쌍을 가져 와서 파일에 기록하기 전에 메시지의 일부로 포함시킵니다. – user420760

0

당신은 "이 클래스가 자신의 문서에 따라 직렬화 할 수없는"이란 무엇을 의미합니까? 클래스를 확장하고 직렬화를 구현해야합니까? 그것의 다만 표식 공용 영역, 이렇게 ...

+1

yes.I 할 수 있습니다. 그러나 왜 그들이 그걸 알려지지 않았는지 궁금합니다. 어쨌든, 나는 그 하나의 메소드가 TibRvMsg에서 getAsBytes()를 발견했습니다. 메시지의 바이트 배열을 반환하는 클래스이며 문서는 메시지를 보관하는 데 사용할 수 있다고 말합니다. – user420760

+1

클래스를 확장하고'Serializable'을 구현하면, 기본 클래스의 필드는 직렬화 할 수 없으며 (좋은 이유로) 인수가없는 생성자가 대신 초기화에 사용됩니다. –

2

또 다른 접근은 serialization proxy를 사용하기위한 것이다. 직렬화 프록시는 오브젝트의 논리 상태로 직렬화되는 오브젝트와 다른 클래스입니다. 이 객체 대신 프록시를 작성하고 프록시를 읽음으로써 객체를 작성하는 Object readResolve() 메소드.

일부 반 의사 코드 :

class Message implements Serializable { 

    private Date dt; 
    private TibrvMsg msg; 

    private Object writeReplace() { 
    return new Proxy(this); 
    } 

    private static class Proxy implements Serializable { 
    private Date dt; 
    private Map msgData; 

    Proxy(Message msg) { 
     this.dt = msg.dt; 
     this.msgData = doTransform(msg.msg, "UTF-16"); 
    } 

    private Object readResolve() { 
     Message msg = new Message(); 
     msg.dtd = dt; 
     msg.msg = asTibrvMsg(msgData); 
     return msg; 
    } 
    } 
} 

는 또한의 readObject (ObjectInputStream에가)는 InvalidObjectException를 던져 우선합니다. 직렬화 프록시 패턴에는 일반 직렬화에 대해 특정 보안 advantages이 있습니다. 또한 몇 가지 있습니다 disadvantages