2012-04-17 13 views
13

Json.NETをカスタマイズしてプライベートメンバーをシリアル化し、パブリックの読み取り専用プロパティを(属性を使用せずに)シリアル化しない方法を教えてください。Json.NETプライベートメンバーをシリアル化し、読み取り専用のプロパティではない

私はカスタムを作成するときに刺さったIContractResolverしかし、少し失われています。

部分的な答えのために

答えて

9

、DefaultContractResolver.DefaultMembersSearchFlagsをいじりすることは、民間のものを含めることを得ることができますいくつかと、これはCLR例外を発生させるように見えるものの

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

は、多数のオブジェクトで動作するようです。

+0

この方法では、読み取り専用のプロパティを除く含めて、あなたに完全に制御することができます。 +1。除外するプロパティを指定するにはどうしたらいいですか?正規表現オプションはさらに優れています。 – Mukus

3

Chris' answerに対する応答では、DefaultContractResolverwas deprecated as of version 6DefaultMemberSearchFlagsプロパティに対応しています。減価償却に関するメッセージにもかかわらず、CreatePropertiesメソッドも同様にL.B explainsのように上書きする必要があります。私のために働いた

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); 
    }   
} 
関連する問題