сериализация Java - PullRequest
       8

сериализация Java

2 голосов
/ 23 августа 2010

Я пытаюсь записать сообщение в файл, используя сериализацию. Сообщение состоит из двух полей: date и TibrvMsg (TibrvMsg является собственным сообщением Tibco, и этот класс не сериализуем согласно их документации).пользовательское сообщение:

Message msg = new Message(TibrvMsg msg)

Проблема в том, что я объявляю Message Serializable, я не могу сериализовать его, поскольку TibrvMsg не сериализуем.Итак, я получаю java.io.NotSerializableException: com.tibco.tibrv.TibrvMsg исключение.

Ответы [ 3 ]

2 голосов
/ 23 августа 2010

Другой подход заключается в использовании сериализованного прокси .Прокси-сервер сериализации - это совершенно другой класс, чем сериализуемый объект с логическим состоянием объекта.Метод 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.Прокси-шаблон сериализации также имеет определенные преимущества безопасности по сравнению с обычной сериализацией.Он также имеет несколько недостатков

1 голос
/ 23 августа 2010

Вам нужно найти способ представить вашу TibrvMsg как сериализуемый объект (может быть что-то , например , который преобразует его в карту).

Затем вы можете переопределить два следующих метода, чтобы записать эти данные в выходной поток (или прочитать их):

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 голосов
/ 23 августа 2010

Что вы подразумеваете под "этот класс не сериализуем согласно их документации"?Couldent вы просто расширяете свой класс и реализуете сериализуемость?Это просто интерфейс маркера, так что ...

...