我有一个API调用传递的对象。现在我尝试使用ObjectOutputStream发送此对象,但该类未实现Serializable。
我无法编辑该类以使其实现Serializable,因为该API和类不是由我编写的。如何使我的对象可序列化?
答案 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,无论如何),您也可以在包装器中使用它。