簡體   English   中英

Jackson 反序列化對象為同一個

[英]Jackson deserialize objects as the same one

我正在使用傑克遜的JsonIdentityInfo注釋,序列化看起來不錯。 但是反序列化沒有像我預期的那樣工作,共享相同 id 的對象沒有反序列化為相同的對象。 以下是 class 定義。

class ParameterResolver implements ObjectIdResolver {
    private final Map<ObjectIdGenerator.IdKey,Object> items = new HashMap<>();

    @Override
    public void bindItem(ObjectIdGenerator.IdKey id, Object pojo) {
        if (items.containsKey(id)) {
            throw new IllegalStateException("Already had POJO for id (" + id.key.getClass().getName() + ") [" + id
                    + "]");
        }
        items.put(id, pojo);
    }

    @Override
    public Object resolveId(ObjectIdGenerator.IdKey id) {
        Object object = items.get(id);
        return object == null ? getById(id) : object;
    }

    protected Object getById(ObjectIdGenerator.IdKey id){
        Object object;
        try {
            object = id.scope.getConstructor().newInstance();
            id.scope.getMethod("setId", Integer.class).invoke(object, (Integer) id.key);
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
        items.put(id, object);
        return object;
    }

    @Override
    public ObjectIdResolver newForDeserialization(Object context) {
        return new ParameterResolver();
    }

    @Override
    public boolean canUseFor(ObjectIdResolver resolverType) {
        return resolverType.getClass() == getClass();
    }
}


@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, resolver = ParameterResolver.class, property = "id", scope = Parameter.class)
class Parameter {
    private Integer id;
    private String data;

    public Parameter() {}

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

class Container {
    public Parameter p;
    public Container() {}
    public Container(Parameter p) {
        this.p = p;
    }
}

這是單元測試

    @Test
    public void test() throws JsonProcessingException {
        Parameter p1 = new Parameter(), p2 = new Parameter();
        p1.setId(1);
        p1.setData("1");
        List<Container> list = new ArrayList<>();
        list.add(new Container(p1));
        list.add(new Container(p1));
        ObjectMapper mapper = new ObjectMapper();
        String content = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(list);
        List<Container> listD = mapper.readValue(content, new TypeReference<List<Container>>() {});
        assertSame(listD.get(0).p, list.get(1).p); // didnt pass this assertion
    }

反序列化從 JSON 創建新對象。 共享相同 id 的對象被反序列化為相同的對象。 但是,這些對象與之前序列化的對象不同。

在您的斷言中,您將反序列化參數實例與用於序列化的實例進行比較:

assertSame(listD.get(0).p, list.get(1).p); // didnt pass this assertion

您應該改為比較兩個反序列化實例:

assertSame(listD.get(0).p, listD.get(1).p); 

請注意第二個參數listD.get(1).p中的“D”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM