2010-08-23 89 views
2

我想寫郵件使用serialization.Message文件包含兩個fields- 日期和TibrvMsgTibrvMsg是Tibco的一個propriotory消息,這個類是不可序列按他們的文檔)。所以我自定義消息是:Java序列化

Message msg = new Message(TibrvMsg msg) 

問題是,雖然我聲明Message Serializable,我不能夠序列作爲TibrvMsg是不可序列。 所以我得到java.io.NotSerializableException: com.tibco.tibrv.TibrvMsg異常。

+0

請問您可以發佈您的代碼,以便它可以更清楚 – 2010-08-23 06:48:22

回答

1

您需要找到一種方法將TibrvMsg表示爲可序列化的對象(可能是like this,將其轉換爲Map)。

然後,您可以覆蓋以下兩種方法來寫這個數據輸出流(或閱讀):

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

Thanks.I做的是完全一樣的。但程序引發異常。我看到的一個選項是從TibrvMsg和附加到消息,然後將消息寫入文件。 – user420760 2010-08-23 06:56:17

+0

什麼例外? – Thilo 2010-08-23 06:57:21

+0

java.io.NotSerializableException:com.tibco.tibrv.TibrvMsg TibrvMsg包含鍵值對。我將獲取它們,然後在將其寫入文件之前包含爲消息的一部分。 – user420760 2010-08-23 07:12:02

0

你是什麼意思是「這個類是不可序列按他們的文檔」嗎? Couldent你只是擴展他們的類並實現可序列化?它只是一個標記接口,所以...

+1

yes.I可以做到這一點。但我想知道他們爲什麼不私自這樣做。無論如何,我發現TibRvMsg中的一個方法getAsBytes返回消息和文檔的字節數組的類表示可以使用它來歸檔消息。 – user420760 2010-08-23 07:23:53

+1

如果擴展一個類並實現'Serializable',那麼基類的字段不是可串行化的(出於很好的理由),而是使用無參數構造函數進行初始化。 – 2010-08-23 10:44:08

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