2

シリアライゼーションを使用してファイルにメッセージを書き込もうとしています。メッセージは、日付とTibrvMsg(TibrvMsgは Tibco による独自のメッセージであり、このクラスはドキュメントに従ってシリアル化できません) の 2 つのフィールドで構成されています。したがって、私のカスタム メッセージは次のとおりです。

Message msg = new Message(TibrvMsg msg)

問題は、宣言していますMessage Serializableが、シリアライズできないため、シリアライズできTibrvMsgません。だから私はjava.io.NotSerializableException: com.tibco.tibrv.TibrvMsg例外を取得します。

4

3 に答える 3

2

もう 1 つの方法は、シリアライゼーション プロキシを使用することです。シリアライゼーション プロキシは、オブジェクトの論理状態でシリアライズされるオブジェクトとはまったく異なるクラスです。オブジェクトの 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をシリアル化可能なオブジェクトとして表現する方法を見つける必要があります(おそらく、このようなもので、マップに変換されます)。

次に、次の2つのメソッドをオーバーライドして、このデータを出力ストリームに書き込む(または読み取る)ことができます。

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 に答える