2016-05-16 381 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(); 
相關問題