当前位置: 首页 > 面试题库 >

如何使用接口序列化一个类?

龙兴贤
2023-03-14
问题内容

我从未对序列化做过很多事情,但是正在尝试使用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中。但我想在源代码中指定实现,因为它总是相同的。