gpt4 book ai didi

java - 反序列化 jackson 中的对象引用

转载 作者:搜寻专家 更新时间:2023-11-01 03:33:01 26 4
gpt4 key购买 nike

我正在尝试使用 ObjectMapper 反序列化对象引用 ($ref)。

 public class Foo {
@JsonProperty("bar")
private Bar bar;

@JsonProperty("bar")
public Bar getBar() {
return bar;
}

@JsonProperty("bar")
public void setBar(Bar bar) {
this.bar = bar;
}
}

测试.json这是我要反序列化的 json 文件。这是引用对象/json 引用的正确方法吗?

{  
"bar": {"$ref": "/bar.json"}
}

反序列化器.java

ObjectMapper objectMapper = new ObjectMapper();
//load class
URL url = Deserializer.class.getClassLoader().getResource("test.json");

//deserialize
objectMapper.readValue(url, Foo.class);

结果创建了一个带有附加属性 "bar": ""$ref": "/bar.json""的 Foo pojo 而不是反序列化它。是否需要实现反序列化接口(interface),手动反序列化节点?

最佳答案

传统上在 Comp Sc 中。使用所谓的“Pointer Swizzling”解决了这个问题。

这意味着如果你有一个包含对 B 的引用的对象 A,并且你想序列化这个结构(然后反序列化它),你需要将指向 B 的指针“unswizzle”到一个“名称”(一个唯一标识实例 B) 的标识符,将其写入磁盘。反序列化时,您将采用该名称,找到它指向 (B) 的实例,并将该名称“调配”回指向 B 的正确指针。

现在,在 Java 中指针被称为引用,但它们是一样的。

举个例子来说明:

originalA = { "id":"id_a", "ref_to_b": originalB}
originalB = { "id":"id_b" }

应用解调:

readyForSerializationA = { "id":"id_a", "ref_to_b": "id_b"}
readyForSerializationB = { "id": "id_b" }

然后写入存储/从存储中读回。

应用调配:

deserializedB = { "id":"id_b" }
deserializedA = { "id": "id_a", "ref_to_b": deserializedB}

针对您的情况,一种可能的方法是首先反序列化所有对象,将它们放入 HashMap 中,然后在第二遍中,从您的各种 ObjectID 中查找 ObjectReference JSON(混合)。

进一步阅读:https://en.wikipedia.org/wiki/Pointer_swizzling

关于java - 反序列化 jackson 中的对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42713591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com