1、简述
> 接口类型序列化 接口形式的嵌套类 可以进行 序列化 ,但是 反序列化 会出错, 由于接口不可被实例化,故在反序列化时 会出错。 对于多态的形式 -- 会在后面的 TypeAdapterFactory / TypeAdapter中去解决 可参考 关于多态的绑定
RuntimeTypeAdapterFactory
2、基本类
public interface GsonInterface {
}
@Data @AllArgsConstructor @NoArgsConstructor public class GsonImplement implements GsonInterface { private Integer id; private String msg; }
@Data @AllArgsConstructor @NoArgsConstructor public class GsonImplements implements GsonInterface { private Integer idx; private String name; }
package sun.rain.amazing.gson.quickstart.implement; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * 接口形式的序列化 / 嵌套类型的序列化 * 接口形式的嵌套类 可以进行 序列化 ,但是 反序列化 会出错 * * @author Reese */ @Data @AllArgsConstructor public class GsonPolymorphism { private Integer uuid; private String username; private GsonInterface gsonInterface; public GsonPolymorphism(Integer uuid, String username) { this.uuid = uuid; this.username = username; } public GsonPolymorphism() { } }
3、测试类
package sun.rain.amazing.gson.quickstart; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import jdk.nashorn.internal.parser.TokenType; import org.junit.Test; import sun.rain.amazing.gson.anno.coll.UserEntity; import sun.rain.amazing.gson.quickstart.extend.GsonFather; import sun.rain.amazing.gson.quickstart.extend.GsonSon; import sun.rain.amazing.gson.quickstart.implement.GsonImplement; import sun.rain.amazing.gson.quickstart.implement.GsonImplements; import sun.rain.amazing.gson.quickstart.implement.GsonInterface; import sun.rain.amazing.gson.quickstart.implement.GsonPolymorphism; import java.util.List; /** * @author sunRainAmazing */ public class GsonImplementsTest { private Gson gson = new Gson(); /** * -- 可以进行 序列化 * {"uuid":101,"username":"tom","gsonInterface":{"id":10,"msg":"cat error"}} * {"uuid":101,"username":"tom","gsonInterface":{"idx":102,"name":"jerry"}} * * -- 反序列化出错 * 接口的形式 不存在 构造器 , 在 反序列化时 会 出错 * java.lang.RuntimeException: Unable to invoke no-args constructor for interface * * Gson 无法实现 接口的多态形式反序列化 * -- 在后续的文章中介绍如何进行 多态形式的反序列化 * */ @Test @Deprecated public void testGsonPolymorphism(){ GsonInterface gi = new GsonImplement(10,"cat error"); GsonPolymorphism gf = new GsonPolymorphism(101,"tom",gi); // json 序列化 String json = gson.toJson(gf); System.out.println(json); // 使用另外一个对象 gi = new GsonImplements(102,"jerry"); gf.setGsonInterface(gi); json = gson.toJson(gf); System.out.println(json); // json 反序列化 -- 出错 GsonPolymorphism u = gson.fromJson(json,GsonPolymorphism.class); System.out.println(u); } }