Gson系列1 --- Gson 序列化与反序列化 -- 接口类型序列化

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);


    }


}


猜你喜欢

转载自blog.csdn.net/sunrainamazing/article/details/80952256