Преобразование объекта (включая лямбду) в JSON и наоборот

Я использую protostuff для преобразования объекта моего собственного класса в JSON и наоборот. Есть ява 8 и лямбда. Преобразовать в файл 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 в объект, есть исключение:

Исключение в потоке "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: com.test.Blabla$$Lambda$4/1699679644

Я думаю, что лямбда это проблема. Могу ли я конвертировать классы с ним?

Объект подан:

private final Function<,> name;

1 ответ

Решение

Ваша лямбда является выражением времени выполнения и не может быть сериализована. Фактически это указатель на метод, который действителен в выполняемом коде, который сериализуется. Что будет делать принимающий код (который десериализует) с таким указателем метода, указывающим на метод в вашем коде отправки?

Если ваш отправляющий код совпадает с получающим кодом, и возможные значения лямбда-выражения представляют собой четко определенный набор различных методов, которые следует учитывать для реализации перечисления и только сериализации значения перечисления:

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();
Другие вопросы по тегам