Преобразование объекта (включая лямбду) в 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();