2015-02-10 52 views
0

我有以下设置:与JsonIgnore摘要属性被序列化(Json.NET)

public abstract class A 
{ 
    [JsonIgnore] 
    public abstract Type Foo { get; } 
} 

public abstract class B : A 
{ 
    public override Type Foo { get { return typeof(D); } } 
} 

public class C : B 
{ 
} 

public abstract class D 
{ 
} 

我的问题是,当我通过以下序列C的实例:

JsonConvert.SerializeObject(instanceOfC, serializationSettings)); 

生成的JSON包含属性Foo的条目。这是预期的结果吗?

serializationSettings如下:

JsonSerializerSettings _serializationSettings = new JsonSerializerSettings 
{ 
    PreserveReferencesHandling = PreserveReferencesHandling.Objects, 
    ReferenceLoopHandling = ReferenceLoopHandling.Serialize, 
    TypeNameHandling = TypeNameHandling.All, 
    ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor 
}; 

编辑:使用Json.NET 6.0.0和.NET 4.5。

+0

我不能和你给的代码重现此问题。请参阅https://dotnetfiddle.net/aEUy3p – 2015-02-11 15:09:07

回答

0

我有同样的问题,我已经通过指定这样JsonSerializerSettings的“ContractResolver”属性(初始化所有必要的属性你)解决它:

var settings = new JsonSerializerSettings 
     { 
      Formatting = Formatting.None, 
      ContractResolver = new PublicNotInternalPropertiesCamelCaseContractResolver() 

     }; 

这里是我的PublicNotInternalPropertiesCamelCaseContractResolver:

public class PublicNotInternalPropertiesCamelCaseContractResolver : CamelCasePropertyNamesContractResolver 
{ 
    #region Overrides of DefaultContractResolver 

    protected override List<MemberInfo> GetSerializableMembers(Type objectType) 
    { 
     var members = base 
      .GetSerializableMembers(objectType) 
      .Where(m => m.GetCustomAttribute<InternalAttribute>() == null) 
      .ToList(); 

     return members; 
    } 

    #endregion 
} 

我不得不创建属性“InternalAttribute”,因为该解决方案不符合JsonIgnoreAttribute出于某些原因工作:

public class InternalAttribute : Attribute 
{ 

} 

我用它是这样的:

public abstract class RavenDbEntity 
{ 
    private string _dbKey; 

    [Internal] 
    public string DbKey 
    { 
     get { return _dbKey; } 
     set 
     { 
      _dbKey = value; 
      Id = int.Parse(value.Split('/')[1]); 
     } 
    } 

    public int Id { get; set; } 
} 

所以输出JSON将不DBKEY财产