C# 使用Json.NET序列化泛型类中的受保护属性

C# 使用Json.NET序列化泛型类中的受保护属性,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我试图序列化一个由许多变量组成的类,这些变量都继承自IMyDataType public abstract class IMyDataType<T> { protected virtual T Data { get; set; } public abstract String ToString(String args = null); public abstract Boolean SetValue(T newValue); public abstra

我试图序列化一个由许多变量组成的类,这些变量都继承自
IMyDataType

public abstract class IMyDataType<T>
{
    protected virtual T Data { get; set; }
    public abstract String ToString(String args = null);
    public abstract Boolean SetValue(T newValue);
    public abstract Boolean CheckValue(T newValue);
    public abstract T GetValue();
}
每当我尝试序列化
IMyDataType
的子类时,变量
T Data
永远不会被序列化,尽管
Min
Max
是。要获得要序列化的
T数据
,我需要做什么


EDIT:根据DotNetom的回答,我将
T Data
的访问修饰符更改为public,从而允许对其进行序列化。不过,它受到保护是有原因的。是否有其他方法可以序列化它,同时保持其访问修饰符的完整性?

默认情况下,Json.NET仅使用公共getter序列化属性(请参阅)。您的财产数据受到保护:

protected virtual T Data { get; set; }
为了使其序列化,您应该将其更改为public:

public virtual T Data { get; set; }

如果不选择更改对公共的访问,那么也可以通过实现自定义契约解析程序来序列化非公共项。有关如何使用它们的示例可以在SO-

上的问题答案中找到。您只需为
数据创建一个备用私有属性getter,并用
[JsonProperty]
属性标记它即可。这将允许Json.Net“查看”并序列化它,而无需更改原始属性的访问修饰符

public abstract class IMyDataType<T>
{
    protected virtual T Data { get; set; }
    ...

    [JsonProperty("Value")]
    private T AlternateData
    {
        get { return Data; }
    }
}
公共抽象类IMyDataType
{
受保护的虚拟T数据{get;set;}
...
[JsonProperty(“价值”)]
二等兵
{
获取{返回数据;}
}
}
小提琴:


(注意:理论上,您可以使用
[JsonProperty]标记受保护的
数据
属性本身。)
attribute,而不是创建备用属性getter。但是,只有在子类中未重写基属性的情况下,这似乎才起作用。一旦重写它,该属性由于某种原因不再起作用——即使您将属性移动到子类或将其放置在基类和子类中。我不确定是否这是Json.Net中的一个bug,或者是故意的。不过,使用另一个getter似乎总是有效的。)

这确实有效。虽然我有理由保护
T数据
。知道如何保持访问修饰符的完整性吗?@KDecker我自己还没有这样做,但似乎您可以弹劾自定义契约解析程序来序列化公共属性。我用链接更新了答案,这会有所帮助you@dotnetom边注:考虑只使用链接到这样的问题-它会自动转换为标题,这正是经常需要的(加上更可读的“看到这个”)。我已经对帖子进行了编辑以显示-请随意回滚,@AlexeiLevenkov谢谢你的提示,我不知道链接是否会自动转换为标题这是“正确”的答案,但我将在下面实现Brian的答案,因为我不需要定制合同提供的所有内容。
public abstract class IMyDataType<T>
{
    protected virtual T Data { get; set; }
    ...

    [JsonProperty("Value")]
    private T AlternateData
    {
        get { return Data; }
    }
}