Json.Net如何确定属性是否应该反序列化?

时间:2018-05-15 07:04:45

标签: json.net

我有一个使用JsonConvert.DeserializeObject反序列化的类。在那个对象中,我已经有了以下内容:

    public string Name { get; private set; }

    public uint TotalFrames { get; private set; }
    public string AttachedDetachBoneId { get; private set; }
    public string StartingBone { get; set; }

    public uint SyncFrame { get; private set; }
    public uint CycleFrames { get; private set; }
    public uint AttachDetachFrame { get; private set; }

这些都从从文件读取的字符串数据中成功反序列化。然后我添加了以下内容:

    public bool ForceAttachedObjectToGround { get; private set; } = true;

进行反序列化。我测试了几个不同的案例并得到了以下结果:

  • 如上所述:未反序列化
  • 删除内联初始化:未反序列化
  • 让setter公开:序列化
  • 添加`JsonProperty'属性:序列化

基于此,我想也许属性类型在某种程度上是问题,并添加了三种不同类型的新测试属性:

    public bool BoolTest { get; private set; }
    public uint UintTest { get; private set; }
    public string StrTest { get; private set; }

这些也没有被反序列化,除非我公开了setter或添加了JsonProperty。如果我然后删除属性/再次将属性设为私有,则反序列化将再次停止工作。

这里发生了什么? Json.Net如何决定反序列化和不反传?

为了完整起见,我确实指定了自己的JsonSerializerSettings。我有 TypeNameHandling = TypeNameHandling.Objects,我指定了一个自定义活页夹。但是在这种情况下不使用活页夹。

1 个答案:

答案 0 :(得分:0)

在这种情况下,(非常明显的)答案是序列化行为是从类实现的接口继承的。:

public interface IAnimationData
{
    [JsonProperty]
    string Name { get; }

    [JsonProperty]
    uint TotalFrames { get; }

    // etc..
}

public class AnimationData :
    IAnimationData
{
    public string Name { get; private set; }
    public uint TotalFrames { get; private set; }

    // etc
}