Para una respuesta parcial, de jugar con DefaultContractResolver.DefaultMembersSearchFlags puede conseguir que se incluyen cosas privadas:
Newtonsoft.Json.JsonSerializerSettings jss = new Newtonsoft.Json.JsonSerializerSettings();
if (includePrivateMembers)
{
Newtonsoft.Json.Serialization.DefaultContractResolver dcr = new Newtonsoft.Json.Serialization.DefaultContractResolver();
dcr.DefaultMembersSearchFlags |= System.Reflection.BindingFlags.NonPublic;
jss.ContractResolver = dcr;
}
return Newtonsoft.Json.JsonConvert.SerializeObject(o, jss);
parece funcionar en una gran cantidad de objetos, aunque con algunos esto parece generar una excepción de CLR.
a mí me funcionó. +1. ¿Cómo puedo ahora especificar qué propiedades excluir? Una opción de expresión regular sería aún mejor. – Mukus