我使用具有一些groovy脚本支持的分布式Java应用程序。现在,在序列化方面,我将获得一个NotSerializableException
用于groovys LazyMap
。我检查了LazyMap的源代码,似乎没有什么东西阻止序列化。如何在这些对象上使用java序列化?我应该字节码操作还是有更简单的方法?由于我们讨论的是分布式应用程序,我们可以假设我们正在讨论大量数据,因此我想避免以递归方式将LayMap复制到另一个中。
答案 0 :(得分:0)
我现在将所有可能的groovy对象包装到Wrapper类中并在此类中使用kryo,这看起来效果很好(至少作为原型)。
public class Wrapper implements Serializable {
private static final long serialVersionUID = 889826451319869803L;
private transient Object wrapped;
public Wrapper() {
}
public Wrapper(Object wrapped) {
this.wrapped = wrapped;
}
private void writeObject(java.io.ObjectOutputStream stream) throws IOException {
Kryo kryo = new Kryo();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Output output = new Output(bos);
kryo.writeObject(output, wrapped);
output.close();
stream.writeObject(bos.toByteArray());
}
private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException {
Kryo kryo = new Kryo();
byte[] bytes = (byte[]) stream.readObject();
ByteArrayInputStream bis = new ByteInputStream(bytes, bytes.length);
Input input = new Input(bis);
wrapped = kryo.readObject(input, LazyMap.class);
input.close();
}
}