Serialización de datos fuertemente vinculados en .NET (personalizando las referencias de JSON.NET)

Quiero evitar reinventar la rueda al serializar datos. Conozco algunas formas de serializar objetos que están vinculados entre sí, pero va desde escribir un código hasta escribir un montón de código para la serialización, y me gustaría evitar eso. Debe haber algunas soluciones genéricas.

Digamos que tengo una estructura 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 } };

Quiero serializar datos a algo como esto:

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

Aquí, los enlaces se serializan solo como nombres, asumiendo que los nombres son únicos. Los enlaces también pueden ser "family.persons.0" o identificaciones únicas generadas o lo que sea.

Requisitos:

El formato debe serlegible por humanos y preferiblementede escritura humana también. Entonces, en orden de preferencia: JSON, YAML *, XML, personalizado. No hay formatos binarios.

La serialización debe soportar todas las buenas cosas que ofrece .NET.Genéricos son obligatorios, incluidos los tipos como IEnumerable <>, IDictionary <> etc. Los tipos dinámicos / objetos sin tipo son deseables.

Formatono debe ser ejecutable. No Lua, Python, etc. scripts y cosas por el estilo.

Si se generan ID únicas, deben ser estables (persistir a través de serialización-deserialización), ya que los archivos se colocarán en unasistema de control de versiones.

* Escuché sobre YAML, pero lamentablemente, parece estar bastante muerto.

Respuestas a la pregunta(1)

Su respuesta a la pregunta