GSON 의 서열 화 문제-(하위 클래스 는 부모 클래스 와 같은 속성 을 가지 고 있 음)

1753 단어 자바GSON
배경
fastjson 의 보안 결함 때문에 프로젝트 에서 fastjson 을 교체 해 야 합 니 다.연구 후 gson 을 서열 화하 기로 결정 했다.
장면
원래 의 직렬 화 코드 로 인해 reids 에 사용 되 었 고 직렬 화 방법 을 다시 썼 으 며,버그 를 직렬 화 한 후에 도 우 리 를 한동안 오도 했다.
GSON 직렬 화 오 류 는 다음 과 같 습 니 다."class XXX declares multiple JSON fields named XXX"는 직렬 화 필드 일 때 오류 가 발생 했 음 을 알 수 있 습 니 다.transient 키워드 수식 을 추가 하면 직렬 화 된 필드 가 필요 없 이 직렬 화 문 제 를 해결 할 수 있 습 니 다.
프로젝트 에 하위 클래스 계승 부모 클래스 가 존재 하고 하위 클래스 transient 는 부모 클래스 와 같은 속성 을 가지 기 때문에 gson 이 서열 화 할 때 오류 가 발생 합 니 다.이 때 transient 만 추가 하면 됩 니 다.
@Getter
@Setter
public class BaseDTO {
    private transient  Long id;
}
@Getter
@Setter
public class ZmsDTO extends BaseDTO {
    private Long id;
    private String name;
    private List childrens = new ArrayList<>();
}

서열 화
  public byte[] serialize(T t) throws SerializationException {
        if (t == null) {
            return new byte[0];
        }

        //JSONObject.toJSONString(t, SerializerFeature.WriteClassName).getBytes(IOUtils.UTF8)
        Gson gson = new Gson();
        String str =gson.toJson(t);
        byte[] bytes = new byte[0];
        try {
            bytes = str.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return  bytes;
    }

역 직렬 화 public T deserialize(byte[]bytes)throws SerializationException{if(bytes==null||bytes.length<=0){return null;}String str = null; try { str = new String(bytes,“UTF-8”); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } //JSONObject.parseObject(str, type, defaultRedisConfig) Gson gson = new Gson(); return gson.fromJson(str, type); }

좋은 웹페이지 즐겨찾기