从外部API创建的Java对象的序列化

时间:2011-03-10 06:34:46

标签: java serialization

我有一个API调用传递的对象。现在我尝试使用ObjectOutputStream发送此对象,但该类未实现Serializable。

我无法编辑该类以使其实现Serializable,因为该API和类不是由我编写的。如何使我的对象可序列化?

2 个答案:

答案 0 :(得分:3)

您必须扩展ObjectOutputStream,并且必须编写自定义的writeObjectOverride()函数。这必须序列化ReplacementClass。然后任何ObjectInputStream都可以读取你的不可序列化的类。

以某种方式工作:

public class MyObjectOutputStream extends ObjectOutputStream {

    public void writeObjectReplace(Object o) {
        if( o instanceof MyUnserializableClass ) {
            o = new ReplacementClass(o);
        }
        super.writeObjectReplace(o);
    }

}

public class ReplacementClass implements Serializable {

    Object o;  

    public ReplacementClass(Object o) {
        this.o = o;
    }

    private void writeObject(ObjectOutputStream stream) throws IOException {
        ...writeObjectToStreamWithMethodsIn stream....
    }

    public Object readReplace(ObjectInputStream stream) {
        ...createOriginalObjectWithDataFromStream...
    }

}

这样做的好处是,不可序列化的对象可以出现在您要序列化的对象图中的任何位置。

答案 1 :(得分:2)

您需要创建一个实现外部类的序列化的包装类。

这不会使原始类可序列化,但您可以通过线路发送包装器实例。

 class MyWrapper implements Serializable{

      private transient TheClass wrapped;

      MyWrapper(TheClass wrapped){
        this.wrapped = wrapped;
      }

      private void writeObject(ObjectOutputStream stream) throws IOException {
          stream.writeObject(wrapped.getA());
          stream.writeObject(wrapped.getB());
      }

      private void readObject(ObjectInputStream stream) throws IOException,
          ClassNotFoundException {
         wrapped = new TheClass();
         wrapped.setA(stream.readObject());
         wrapped.setB(stream.readObject()); 
     }

这取决于您是否能够使用其公共setter,getter和构造函数重建实例。

如果原始实例支持其他形式的序列化(XML,ASN1,无论如何),您也可以在包装器中使用它。