2013-08-25 4 views
1

Я использую Gson для десериализации класса, который унаследован от абстрактного класса.Java JSON deserialize класс наследования

Вот мой код:

public abstract class Mammal { 
    private String name; 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName(){ 
     return name; 
    } 
} 

public class Dog extends Mammal { 
    public void bark(){ 

    } 
} 

public class Cat extends Mammal{ 

    public void mew(){ 

    } 
} 

public class Main { 
    public static void main(String[] args) { 
     Gson gson = new Gson(); 
     Mammal dog = new Dog(); 
     String toGson = gson.toJson(dog); 
     Mammal aDog = gson.fromJson(toGson, Mammal.class); 
    } 
} 

Исключение генерируется, когда я запускаю его, кто-то может сказать мне, как это исправить?

+3

Что такое исключение, что вы получаете? –

ответ

1

В соответствии

Mammal aDog = gson.fromJson(toGson, Mammal.class); 

вы пытаетесь десериализациями к экземпляру объекта млекопитающим, которые не могут быть сделаны потому, что Mammal является абстрактным классом, который означает, что не может быть реализован.

Вам нужно либо удалить abstract ключевое слово из Mammal описания класса или использовать не абстрактный класс, а не как Dog.class

Mammal aDog = gson.fromJson(toGson, Dog.class); 
+0

Спасибо. Тогда, если во время выполнения я не знаю, что такое класс ADog, я просто знаю, что это подкласс Mammal, и мне нужно отдать его в правый подкласс, что мне делать? – user2716189

+0

@ пользователь2716189 Это хороший вопрос. Вы должны спросить его как выделенный поток, но прежде чем вы это сделаете, проверьте этот [фрагмент учебника Gson] (https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing- Коллекция-с-объекты-оф-Произвольные-типов). – Pshemo

+0

@ user2716189 Также в [этом ответе] (http://stackoverflow.com/a/5813490/1393766) автор упоминает об использовании 'listOfTestObject' при сериализации и десериализации коллекций разных объектов. – Pshemo

Смежные вопросы