Serialisieren stark verknüpfter Daten in .NET (Anpassen von JSON.NET-Referenzen)

Ich möchte vermeiden, das Rad beim Serialisieren von Daten neu zu erfinden. Ich kenne einige Möglichkeiten, um miteinander verknüpfte Objekte zu serialisieren, aber es reicht vom Schreiben von Code bis zum Schreiben von viel Code für die Serialisierung, und das möchte ich vermeiden. Es muss einige generische Lösungen geben.

Nehmen wir an, ich habe eine Struktur wie diese:

Person
    bro = new Person { name = "bro", pos = new Pos { x = 1, y = 5 } },
    sis = new Person { name = "sis", pos = new Pos { x = 2, y = 6 } },
    mom = new Person { name = "mom", pos = new Pos { x = 3, y = 7 }, 
        children = new List<Person> { bro, sis }
    },
    dad = new Person { name = "dad", pos = new Pos { x = 4, y = 8 }, 
        children = new List<Person> { bro, sis }, mate = mom
    };
mom.mate = dad;
Family family = new Family { persons = new List<Person> { mom, dad, bro, sis } };

Ich möchte die Daten folgendermaßen serialisieren:

family: {
    persons: [
        { name: "bro", pos: { x: 1, y: 5 } },
        { name: "sis", pos: { x: 2, y: 6 } },
        { name: "mom", pos: { x: 3, y: 7 }, mate: "dad", children: [ "bro", "sis" ] },
        { name: "dad", pos: { x: 4, y: 8 }, mate: "mom", children: [ "bro", "sis" ] },
    ]
}

Hier werden Links nur als Namen serialisiert, mit der Annahme, dass Namen eindeutig sind. Links können auch "family.persons.0" oder generierte eindeutige IDs oder was auch immer sein.

Bedarf:

Format muss seinfür Menschen lesbar und vorzugsweisemenschlich beschreibbar auch. Also, in der Reihenfolge der Präferenzen: JSON, YAML *, XML, benutzerdefiniert. Keine Binärformate.

Die Serialisierung muss alle guten .NET-Angebote unterstützen.Generika sind ein Muss, einschließlich Typen wie IEnumerable <>, IDictionary <> usw. Dynamische Typen / untypisierte Objekte sind wünschenswert.

Formatdarf nicht ausführbar sein. Keine Lua, Python etc. Skripte und ähnliches.

Wenn eindeutige IDs generiert werden, müssen diese stabil sein (bestehen bleiben durch Serialisierung-Deserialisierung), da die Dateien in a abgelegt werdenVersionskontrollsystem.

* Von YAML gehört, aber leider scheint es so ziemlich tot zu sein.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage