Szeregowanie mocno połączonych danych w .NET (dostosowywanie referencji JSON.NET)

Chcę uniknąć ponownego wymyślania koła podczas serializacji danych. Znam kilka sposobów na serializację obiektów, które są ze sobą powiązane, ale rozciąga się od pisania kodu do pisania kodu do serializacji i chciałbym tego uniknąć. Muszą istnieć pewne ogólne rozwiązania.

Powiedzmy, że mam taką strukturę:

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 } };

Chcę serializować dane do czegoś takiego:

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" ] },
    ]
}

W tym przypadku linki są serializowane jako tylko nazwy, przy założeniu, że nazwy są unikalne. Linki mogą być także „family.persons.0” lub wygenerowane unikalne identyfikatory lub cokolwiek innego.

Wymagania:

Format musi byćczytelny dla człowieka i najlepiejzapisywalny dla ludzi zbyt. Tak więc, w kolejności preferencji: JSON, YAML *, XML, niestandardowe. Brak formatów binarnych.

Serializacja musi obsługiwać wszystkie dobre rzeczy oferowane przez .NET.Generics są koniecznością, włącznie z typami takimi jak IEnumerable <>, IDictionary <> itp. Pożądane są typy dynamiczne / obiekty bez typów.

Formatnie może być wykonywalny. Brak skryptów Lua, Pythona itp.

Jeśli generowane są unikalne identyfikatory, muszą być one stabilne (utrzymywać przez serializację-deserializację), ponieważ pliki zostaną umieszczone wsystem kontroli wersji.

* Słyszałem o YAML, ale niestety wydaje się, że jest prawie martwy.

questionAnswers(1)

yourAnswerToTheQuestion