2012-04-17 10 views

risposta

9

Per una risposta parziale, scherzi con DefaultContractResolver.DefaultMembersSearchFlags può ottenere per includere cose private:

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

sembra funzionare su un sacco di oggetti, anche se con alcuni questo sembra generare un'eccezione CLR.

+0

lavorato per me. +1. Come posso specificare quali proprietà escludere? Un'opzione regex sarebbe ancora meglio. – Mukus

3

In risposta a Chris' answer, la proprietà DefaultMemberSearchFlags su DefaultContractResolverwas deprecated as of version 6. Nonostante ciò che dice il messaggio di deprecazione, credo che dovrai sovrascrivere anche il metodo CreateProperties, come L.B explains.

Questo metodo ti dà il controllo completo, compreso esclusi proprietà di sola lettura:

class PrivateContractResolver : DefaultContractResolver 
{ 
    protected override List<MemberInfo> GetSerializableMembers(Type objectType) 
    { 
     var flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; 
     MemberInfo[] fields = objectType.GetFields(flags); 
     return fields 
      .Concat(objectType.GetProperties(flags).Where(propInfo => propInfo.CanWrite)) 
      .ToList(); 
    } 

    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
    { 
      return base.CreateProperties(type, MemberSerialization.Fields); 
    }   
} 
Problemi correlati