2016-05-16 375 views
2

我使用protostuff将我自己的类的对象转换为JSON,反之亦然。有java 8和lambda。 转换为像JSON文件:从JSON将对象(包含lambda)转换为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); 

转换为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; 
+0

确保所有的课程都在课程路径中,并且包装正确(例如:com.test.Blabla).. –

+0

是的,我确定。为测试我创建了简单的类人字段功能<>,创建实例像人物=新人(“名称”,“姓氏”,S - >新的字符串());'转换,相同的例外。 –

回答

3

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

如果您发送的代码相同的接收码,和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(); 
相关问题