Java: как сериализовать объект Java, созданный сторонней библиотекой?

#java #serialization

#java #сериализация

Вопрос:

Итак, я использую проприетарную библиотеку Java в проекте, к исходному коду которого у меня нет доступа.

Он выдает объект Message, и, очевидно, я не могу реализовать Serializable. Он генерируется во время выполнения.

какие у меня варианты? Есть ли способ сериализовать объект сообщения в массив байтов и обратно в объект?

ОБНОВЛЕНИЕ: я смог сериализовать объект в JSON (http://code.google.com/p/json-io /) но не смог преобразовать его обратно в объект, так как он возвращает null. Итак, я пытаюсь преобразовать его в массив байтов, используя приведенный ниже код. Все еще не работает.

 public byte[] toByteArray (Object obj)
{
  byte[] bytes = null;
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  try {
    ObjectOutputStream oos = new ObjectOutputStream(bos); 
    oos.writeObject(obj);
    oos.flush(); 
    oos.close(); 
    bos.close();
    bytes = bos.toByteArray ();
  }
  catch (IOException ex) {
    //TODO: Handle the exception
  }
  return bytes;
}

public Object toObject (byte[] bytes)
{
  Object obj = null;
  try {
    ByteArrayInputStream bis = new ByteArrayInputStream (bytes);
    ObjectInputStream ois = new ObjectInputStream (bis);
    obj = ois.readObject();
  }
  catch (IOException ex) {
    //TODO: Handle the exception
  }
  catch (ClassNotFoundException ex) {
    //TODO: Handle the exception
  }
  return obj;
}
  

Комментарии:

1. Знаете ли вы, реализует ли объект Serializable? Если вы не знаете, вы можете просто попробовать, чтобы посмотреть, работает ли это.

2. он уже не реализует Serializable.

3. вы имеете в виду что-то вроде public MyMessage extends 3rd.party.Message implements Serializable{} ?

Ответ №1:

Вы могли бы написать сериализуемую оболочку, в которой хранится все необходимое для воссоздания объекта Message.

Ответ №2:

XStream — один из способов.

Ответ №3:

Конечно, вы просто не можете использовать этот java.lang.Serializable механизм.

Выберите любой формат: XML, JSON, буфер протокола или что-то еще, что может вам подойти.

Теперь вы несете ответственность за оба конца диалога: сериализацию и десериализацию.

Комментарии:

1. его буфер протокола, а не буфер прототипа.

2. Спасибо, я шел слишком быстро.

Ответ №4:

Если объект является Java bean, вы можете использовать java.beans.XMLEncoder and java.beans.XMLDecoder для сериализации.