簡體   English   中英

將對象(包括lambda)轉換為JSON,反之亦然

[英]Converting object (inclusive lambda) to JSON and vice versa

我正在使用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時,有一個例外:

線程“主”中的異常java.lang.RuntimeException:java.lang.ClassNotFoundException:com.test.Blabla $$ Lambda $ 4/1699679644

我認為lambda是一個問題。 我可以用它轉換類嗎?

對象已歸檔:

private final Function<,> name;

您的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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM