将对象(包含lambda)转换为JSON,反之亦然

时间:2016-05-16 08:22:16

标签: java json lambda classnotfoundexception protostuff

我正在使用protostuff将我自己的类的对象转换为JSON,反之亦然。有java 8和lambdas。 转换为JSON文件,如:

LinkedBuffer buffer = LinkedBuffer.allocate(2048);
Schema schema = RuntimeSchema.getSchema(obj.getClass());
boolean numeric = false;
byte[] json = JsonIOUtil.toByteArray(obj, schema, numeric, buffer);
Files.write(file, json);

从JSON转换为obj:

Schema<MyClass> schema = RuntimeSchema.getSchema(MyClass.class);
Path path = Paths.get("path");
byte[] as = Files.readAllBytes(path);
MyClass mc = schema.newMessage();
JsonIOUtil.mergeFrom(as, mc, schema, false);

当我尝试将JSON转换为obj时,有一个例外:

  

线程“main”中的异常java.lang.RuntimeException:java.lang.ClassNotFoundException:com.test.Blabla $$ Lambda $ 4/1699679644

我认为lambda是个问题。我可以用它转换类吗?

对象有一个字段:

private final Function<,> name;

1 个答案:

答案 0 :(得分:4)

您的lambda是一个运行时表达式,无法序列化。它实际上是一个方法指针,在您运行的代码序列化中有效。接收代码(反序列化)对这样的方法指针做什么,指向发送代码中的方法?

如果您的发送代码与接收代码相同,并且lambda表达式的可能值是一组明确定义的不同方法,您应该考虑实现枚举并仅序列化枚举值:

public enum Lambdas
{
    FIRST( s -> new String()),
    SECOND( s -> s + " ");

    private Function<String, String> myLambda;

    private Lambdas( Function<String, String> aLambda )
    {
        myLambda = aLambda;
    }

    public Function<String, String> getLambda()
    {
        return myLambda;
    }
}

如果您的人员现在有会员

private Lambdas myLambda;

(可序列化)您的接收代码可以像这样使用它:

String result = myLambda.getLambda().apply();