Serializando dados altamente vinculados no .NET (personalizando referências JSON.NET)

Eu quero evitar reinventar a roda ao serializar dados. Eu sei algumas maneiras de serializar objetos que estão ligados uns aos outros, mas varia de escrever algum código para escrever um monte de código para serialização, e eu gostaria de evitar isso. Deve haver algumas soluções genéricas.

Digamos que eu tenha uma estrutura como esta:

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

Eu quero serializar dados para algo como isto:

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

Aqui, os links são serializados apenas como nomes, com a suposição de que os nomes são exclusivos. Os links também podem ser "family.persons.0" ou gerar IDs exclusivos ou o que for.

Requisitos:

O formato deve serlegível para humanos e de preferênciahumano-gravável também. Então, em ordem de preferência: JSON, YAML *, XML, custom. Nenhum formato binário.

Serialização deve suportar todas as boas ofertas .NET.Genéricos são obrigatórios, incluindo tipos como IEnumerable <>, IDictionary <> etc. Tipos dinâmicos / objetos não tipados são desejáveis.

Formatonão deve ser executável. Não Lua, Python, etc scripts e coisas assim.

Se IDs exclusivos forem gerados, eles deverão ser estáveis ​​(persistir por meio de serialização-desserialização), pois os arquivos serão colocados em umsistema de controle de versão.

* Ouvi falar do YAML, mas, infelizmente, parece estar praticamente morto.

questionAnswers(1)

yourAnswerToTheQuestion