我从未对序列化做过很多事情,但是正在尝试使用Google的gson将Java对象序列化为文件。这是我的问题的一个示例:
public interface Animal {
public String getName();
}
public class Cat implements Animal {
private String mName = "Cat";
private String mHabbit = "Playing with yarn";
public String getName() {
return mName;
}
public void setName(String pName) {
mName = pName;
}
public String getHabbit() {
return mHabbit;
}
public void setHabbit(String pHabbit) {
mHabbit = pHabbit;
}
}
public class Exhibit {
private String mDescription;
private Animal mAnimal;
public Exhibit() {
mDescription = "This is a public exhibit.";
}
public String getDescription() {
return mDescription;
}
public void setDescription(String pDescription) {
mDescription = pDescription;
}
public Animal getAnimal() {
return mAnimal;
}
public void setAnimal(Animal pAnimal) {
mAnimal = pAnimal;
}
}
public class GsonTest {
public static void main(String[] argv) {
Exhibit exhibit = new Exhibit();
exhibit.setAnimal(new Cat());
Gson gson = new Gson();
String jsonString = gson.toJson(exhibit);
System.out.println(jsonString);
Exhibit deserializedExhibit = gson.fromJson(jsonString, Exhibit.class);
System.out.println(deserializedExhibit);
}
}
因此,这很好地进行了序列化-但可以理解的是,它删除了Animal上的类型信息:
{"mDescription":"This is a public exhibit.","mAnimal":{"mName":"Cat","mHabbit":"Playing with yarn"}}
但是,这会导致反序列化的实际问题:
Exception in thread "main" java.lang.RuntimeException: No-args constructor for interface com.atg.lp.gson.Animal does not exist. Register an InstanceCreator with Gson for this type to fix this problem.
我知道为什么会发生这种情况,但是在弄清楚处理这种情况的正确模式时遇到了麻烦。我确实看过指南,但并未直接解决。
将动物标为transient
,则不会序列化。
或者,您可以自己通过实现defaultWriteObject(...)
和进行序列化defaultReadObject(...)
(我认为这就是所谓的…)
编辑 在此处参阅有关“编写实例创建器”的部分。
Gson无法反序列化接口,因为它不知道将使用哪个实现类,因此您需要为Animal提供实例创建者并设置默认值或类似值。
问题内容: 的功能需要Class。但是,如果我内部传递的类将某些接口作为数据成员,该如何使用它。 尽管我可以理解此异常的原因,因为杰克逊没有获得所传递类的内部接口的具体类,但我的问题是如何解决它?那我该如何反序列化呢?我要反序列化的类是: 这是一个接口,所以这给了我以下错误:- 问题答案: 杰克逊显然不能构造对象,因为它是一个接口。您将需要在json和ObjectMapper中具有其他信息,以告诉
我是solr的新手,当我试图在Solr中序列化/反序列化一个Map时,我遇到了一个问题。 我在Java应用程序中使用Spring Data Solr,如下所示: 它在Solr中展平并序列化我地图,如下所示: 但是,当我运行搜索时,返回的对象始终将此字段设置为 NULL。反序列化不适用于此特定字段,看起来它无法识别键 1、键 2...作为地图的一部分。 有人知道如何使派生工作吗?我必须实现自定义转换
我很难将JSON反序列化到下面示例中实现基本接口的一些类ChildA、ChildB等。 异常是:com.fasterxml.jackson.databind.JsonMappingExc0019:意外令牌(END_OBJECT),预期FIELD_NAME:缺少包含类型id的属性type(对于类Basic) 预期的JSON如下所示: 没有在所有类型对象中显示的属性,因此它们完全不同。但正如您在rea
问题内容: 反序列化接口和抽象属性的一种方法是类,是在序列化和反序列化期间将TypeNameHandling设置为Auto。但是,当我尝试直接对接口对象进行序列化和反序列化时,它不起作用- 序列化和反序列化代码- 我注意到,即使在设置TypeNameHandling.Auto时,类型信息也不会出现在序列化字符串中。但是,将TypeNameHandling设置为Object或All即可。 我在这里缺
null 但是,当我以Yar-Client模式提交Spark应用程序时,抛出了以下异常: 线程“main”org.apache.spark.sparkException:Task not serializable at org.apache.spark.util.closureCleaner$.ensureRecleaner.ccala:166)at org.apache.spark.util.c
我想用Jackson反序列化一个JSON对象。因为目标是一个接口,所以我需要指定应该使用哪个实现。 这些信息可以使用@jsonTypeInfo-Annotation存储在JSON-Object中。但我想在源代码中指定实现,因为它总是相同的。