将对象(包含 lambda)转换为 JSON,反之亦然
Converting object (inclusive lambda) to JSON and vice versa
我正在使用 protostuff 将我自己的对象 class 转换为 JSON,反之亦然。有 java 8 和 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);
从 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 a 时出现异常:
Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: com.test.Blabla$$Lambda/1699679644
我认为 lambda 是个问题。我可以用它转换 classes 吗?
对象有一个字段:
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();
我正在使用 protostuff 将我自己的对象 class 转换为 JSON,反之亦然。有 java 8 和 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);
从 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 a 时出现异常:
Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: com.test.Blabla$$Lambda/1699679644
我认为 lambda 是个问题。我可以用它转换 classes 吗?
对象有一个字段:
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();