タイルのリストを含む Planet クラスがあります。各タイルには、隣接するタイルのリストもあります。何らかの方法で、すべてのタイルが (間接的に) 接続されています。今、これを 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 に「隣人」リストの参照と、タイル リストの実際のクラスを強制的に使用させることはできますか? したがって、次のようになります。
tiles:
- &o0
name: a
neighbours:
- *o1
- *o2
- &o1
name: b
neighbours:
- *o0
- *o2
- &o2
name: c
neighbours:
- *o0
- *o1
ありがとう!