使用Java8为Gson编写序列化程序
我有一个自己的类,名为使用Java8为Gson编写序列化程序,java,json,serialization,gson,java-8,Java,Json,Serialization,Gson,Java 8,我有一个自己的类,名为MyDate,我想为Gson编写一个序列化程序。此代码适用于: GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(MyDate.class, new JsonSerializer<MyDate>() { @Override public JsonElement serialize(MyDate date, Type typeOfSrc, JsonSeriali
MyDate
,我想为Gson编写一个序列化程序。此代码适用于:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MyDate.class, new JsonSerializer<MyDate>() {
@Override
public JsonElement serialize(MyDate date, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(date.toString());
}
});
但这里eclipse告诉我
此表达式的目标类型必须是函数接口
Java 8代码有什么问题?为了用lambda替换匿名类,参数必须是单方法接口(SMI) 这是一个
接口
,具有单个摘要
方法
将对象
作为第二个参数
您需要首先分配lambda,然后传入方法:
final JsonSerializer<MyDate> serializer = (date, typeOfSrc, context) -> new JsonPrimitive(date.toString());
builder.registerTypeAdapter(MyDate.class, serializer);
final JsonSerializer serializer=(日期、typeOfSrc、上下文)->新的JsonPrimitive(date.toString());
registerTypeAdapter(MyDate.class,序列化程序);
通过这种方式,您可以告诉编译器要实现哪个SMI。您确定要使用Java 8编译吗<代码>生成器.registerTypeAdapter(MyDate.class,(JsonSerializer)(日期,typeOfSrc,上下文)->新的JsonPrimitive(date.toString())代码>适用于me@AlexisC. 这是因为演员阵容(也是另一个解决方案)。@Radiodef我这么说是因为OP不应该有这个错误消息。使用javac,我得到了不兼容的类型:对象不是函数接口。这是有道理的,所以可能是ECJ消息有点误导(这不会让我感到惊讶);-)。。。确实,目标类型不是一个函数接口,但是javac在这里更精确一些。。。。但别客气。我的第一条评论有点愚蠢,如果OP有这个错误消息,那么他显然是用Java8:DThanks编译的。第一行末尾缺少分号。我不允许做这么小的编辑。
final JsonSerializer<MyDate> serializer = (date, typeOfSrc, context) -> new JsonPrimitive(date.toString());
builder.registerTypeAdapter(MyDate.class, serializer);