YamlDotNet 指定序列化的主要父级?
YamlDotNet specify main parent for serialization?
我有一个星球 class,其中包含一个图块列表。每个图块还有一个相邻图块列表。以某种方式,所有瓷砖都连接(间接)。现在我正在尝试使用 YamlDotNet 将其序列化。然而,我得到了一个非常难看的嵌套序列化。
一个最小的工作示例:(https://dotnetfiddle.net/sWGKMB)
public class Planet {
public Tile[] tiles {get;set;}
}
public class Tile {
public string name { get; set; }
public Tile[] neighbours { get; set; }
}
public class SerializeObjectGraph
{
public void Main()
{
var p = new Planet();
var a = new Tile();
var b = new Tile();
var c = new Tile();
a.name = "a";
b.name = "b";
c.name = "c";
a.neighbours = new Tile[] {b,c};
b.neighbours = new Tile[] {a,c};
c.neighbours = new Tile[] {b,a};
p.tiles = new Tile[] {a,b,c};
var serializer = new Serializer();
serializer.Serialize(Console.Out, p);
}
}
这给出了 yaml 文档:
tiles:
- &o0
name: a
neighbours:
- &o1
name: b
neighbours:
- *o0
- &o2
name: c
neighbours:
- *o1
- *o0
- *o2
- *o1
- *o2
如您所见,由于所有方块都以某种方式连接(在我的迷你示例中直接连接),行星列表中的第一个方块将为所有方块创建一个巨大的嵌套结构。
是否可以强制 YamlDotNet 使用 "neighbours" 列表中的引用,以及 tiles 列表中的实际 class?所以它看起来像这样:
tiles:
- &o0
name: a
neighbours:
- *o1
- *o2
- &o1
name: b
neighbours:
- *o0
- *o2
- &o2
name: c
neighbours:
- *o0
- *o1
谢谢!
由于Serializer的实现方式,无法实现你想要的。使用的策略是在对象第一次出现在图中时发出对象,并在每隔一次出现时使用引用。
按照您的建议进行操作实际上会产生格式错误的 YAML。规范 explicitly forbids 在声明之前引用节点:
It is an error for an alias node to use an anchor that does not previously occur in the document.
解决方法是将相邻关系与图块本身分开序列化,但您必须更改对象或使用中间表示。
我有一个星球 class,其中包含一个图块列表。每个图块还有一个相邻图块列表。以某种方式,所有瓷砖都连接(间接)。现在我正在尝试使用 YamlDotNet 将其序列化。然而,我得到了一个非常难看的嵌套序列化。
一个最小的工作示例:(https://dotnetfiddle.net/sWGKMB)
public class Planet {
public Tile[] tiles {get;set;}
}
public class Tile {
public string name { get; set; }
public Tile[] neighbours { get; set; }
}
public class SerializeObjectGraph
{
public void Main()
{
var p = new Planet();
var a = new Tile();
var b = new Tile();
var c = new Tile();
a.name = "a";
b.name = "b";
c.name = "c";
a.neighbours = new Tile[] {b,c};
b.neighbours = new Tile[] {a,c};
c.neighbours = new Tile[] {b,a};
p.tiles = new Tile[] {a,b,c};
var serializer = new Serializer();
serializer.Serialize(Console.Out, p);
}
}
这给出了 yaml 文档:
tiles:
- &o0
name: a
neighbours:
- &o1
name: b
neighbours:
- *o0
- &o2
name: c
neighbours:
- *o1
- *o0
- *o2
- *o1
- *o2
如您所见,由于所有方块都以某种方式连接(在我的迷你示例中直接连接),行星列表中的第一个方块将为所有方块创建一个巨大的嵌套结构。
是否可以强制 YamlDotNet 使用 "neighbours" 列表中的引用,以及 tiles 列表中的实际 class?所以它看起来像这样:
tiles:
- &o0
name: a
neighbours:
- *o1
- *o2
- &o1
name: b
neighbours:
- *o0
- *o2
- &o2
name: c
neighbours:
- *o0
- *o1
谢谢!
由于Serializer的实现方式,无法实现你想要的。使用的策略是在对象第一次出现在图中时发出对象,并在每隔一次出现时使用引用。
按照您的建议进行操作实际上会产生格式错误的 YAML。规范 explicitly forbids 在声明之前引用节点:
It is an error for an alias node to use an anchor that does not previously occur in the document.
解决方法是将相邻关系与图块本身分开序列化,但您必须更改对象或使用中间表示。