Gson含抽象类的反序列化
场景描述:
反序列化A类的时候,这个类里面有一个抽象类属性B,B的实现类C里面又有一个抽象类属性D,D的实现类是E
实体类准备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
   | public class A implements Serializable {     private B b;
      public A(B b) {         this.b = b;     }
      @Override     public String toString() {         return "A{" +                 "b=" + b +                 '}';     } } public abstract class B implements Serializable {     protected String name;
      public B(){}     public B(String name) {         this.name = name;     }
      @Override     public String toString() {         return "B{" +                 "name='" + name + '\'' +                 '}';     } } public class C extends B{     private D d;
      public C(String name) {         super(name);     }     public C(String name,D d) {         super(name);         this.d = d;     }
      @Override     public String toString() {         return "C{" +                 "d=" + d +                 '}';     } } public abstract class D implements Serializable {     protected String name;
      public D(){}     public D(String name) {         this.name = name;     }
      @Override     public String toString() {         return "D{" +                 "name='" + name + '\'' +                 '}';     } } public class E extends D{     public E() {         super("this is E");     }
      public E(String name, String name1) {         super(name);         this.name = name1;     }
      @Override     public String toString() {         return "E{" +                 "name='" + name + '\'' +                 '}';     } }
  | 
 
反序列化适配器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | public class Adapter<T> implements JsonDeserializer<T> {     private T obj;
      @SuppressWarnings("unchecked")     public Adapter(Class<?> clz) {         this.obj = (T) clz;     }
      @Override     public T deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {         try {             return OK.GsonFactory.gson.fromJson(jsonElement, (Type) Class.forName(((Class) obj).getName()));         } catch (ClassNotFoundException e) {             throw new JsonParseException(e);         }     } }
  | 
 
反序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
   | public class OK {     public static void main(String[] args) {         E e = new E("this is e","this e is filed");         C c = new C("this is c", e);         final A a = new A(c);
          final A a1 = GsonFactory.gson.fromJson(new Gson().toJson(a), A.class);
          System.out.println(a);           System.out.println(a1);       }
      public static class GsonFactory {         public static Gson gson;         static {             gson = new GsonBuilder()                                          .registerTypeAdapter(B.class,new Adapter<C>(C.class))                     .registerTypeAdapter(D.class,new Adapter<E>(E.class))                     .create();         }     } }
  |