如何在Java中序列化groovys LazyMap

时间:2016-03-17 10:01:16

标签: java serialization groovy

我使用具有一些groovy脚本支持的分布式Java应用程序。现在,在序列化方面,我将获得一个NotSerializableException用于groovys LazyMap。我检查了LazyMap的源代码,似乎没有什么东西阻止序列化。如何在这些对象上使用java序列化?我应该字节码操作还是有更简单的方法?由于我们讨论的是分布式应用程序,我们可以假设我们正在讨论大量数据,因此我想避免以递归方式将LayMap复制到另一个中。

1 个答案:

答案 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();
    }
}