我基本上有一个类似图表的 struct .大概是这样的:
public class Whole {
public List<Node> allPossibleNodes = new List<Node>();
}
public class Node {
public List<Node> neighbors = new List<Node>();
}
现在,我想使用以下代码将其序列化:
public class WriteTest {
static JsonSerializerOptions options = new () {
WriteIndented = true,
IncludeFields = true,
IgnoreReadOnlyProperties = true,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
ReferenceHandler = ReferenceHandler.Preserve,
};
public static void write() {
var w = new Whole();
Node? p = null; //previous
for (int i = 0; i < 3; i++) {
var n = new Node();
w.allPossibleNodes.Add(n);
if (p != null) {
n.neighbors.Add(p);
p.neighbors.Add(n);
}
p = n;
}
var json = JsonSerializer.Serialize(w, options);
File.WriteAllText("test.json", json);
}
public static void read() {
var json = File.ReadAllText("test2.json");
var w = JsonSerializer.Deserialize<Whole>(json, options);
}
}
它会产生以下输出:
{
"$id": "1",
"allPossibleNodes": {
"$id": "2",
"$values": [
{
"$id": "3",
"neighbors": {
"$id": "4",
"$values": [
{
"$id": "5",
"neighbors": {
"$id": "6",
"$values": [
{
"$ref": "3"
},
{
"$id": "7",
"neighbors": {
"$id": "8",
"$values": [
{
"$ref": "5"
}
]
}
}
]
}
}
]
}
},
{
"$ref": "5"
},
{
"$ref": "7"
}
]
}
}
它的问题在于:
- 它最终会抛给我一个例外:
"JsonException:‘检测到可能的对象循环.这可能是 由于周期或如果对象深度大于最大值 允许的深度为64."
或者,如果我设置为options.MaxDepth = Int.MaxValue;
,它可能会使堆栈溢出.
- 我不只是丑陋的,人类不可读的垃圾.
我想要的是这样的东西:
{
"$id": "1",
"allPossibleNodes": {
"$id": "2",
"$values": [
{
"$id": "3",
"neighbors": {
"$id": "6",
"$values": [
{
"$ref": "4"
}
]
}
},
{
"$id": "4",
"neighbors": {
"$id": "7",
"$values": [
{
"$ref": "3"
},
{
"$ref": "5"
},
]
}
},
{
"$id": "5",
"neighbors": {
"$id": "8",
"$values": [
{
"$ref": "4"
}
]
}
}
]
}
}
但不幸的是,序列化程序甚至无法读取它,只能哭着说"'Reference'4' was not found."
有没有办法让这一切顺利进行?