1

タイルのリストを含む 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

ありがとう!

4

1 に答える 1