2

我正在尝试使用序列化将消息写入文件。消息由两个字段组成 - 日期和TibrvMsgTibrvMsg是 Tibco 的专有消息,并且根据他们的文档,此类不可序列化)。所以我的自定义消息是:

Message msg = new Message(TibrvMsg msg)

问题是虽然我正在声明Message Serializable,但我无法序列化它,因为TibrvMsg它不可序列化。所以我得到java.io.NotSerializableException: com.tibco.tibrv.TibrvMsg了例外。

4

3 回答 3

2

另一种方法是使用序列化代理。序列化代理与使用对象的逻辑状态序列化的对象完全不同。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。序列化代理模式也比普通序列化具有一定的安全优势。它也有一些缺点

于 2010-08-23T10:03:28.767 回答
1

您需要找到一种方法将您的 TibrvMsg 表示为可序列化的对象(可能类似于 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());
 }
于 2010-08-23T06:52:36.150 回答
0

“根据他们的文档,此类不可序列化”是什么意思?你能不能只扩展他们的类并实现可序列化?它只是一个标记界面,所以...

于 2010-08-23T07:21:08.593 回答