Json.NET填充一个类,但不填充另一个类

时间:2018-09-14 14:33:18

标签: c# json.net

我正在尝试使用Json.Net这样填充对象ParticleSystem对象:

public void LoadJson(string path, object targetObject)
{
   using (var sw = new StreamReader(path))
        using (var reader = new JsonTextReader(sw))
            JsonHelpers.DefaultSerializer.Populate(reader, targetObject);
}

具有以下json文件:

{
  "TexturePath": "Particles/snow",
  "MaxParticles": 8500
}

这是课程的一部分(整个内容太大,无法发布)

public class ParticleSystem : Entity3D
{
        public int MaxParticles;
        public string TexturePath { get; set; } = "Textures/default_diffuse";

        public void Load()
        {
            LoadJson("Data/Particles/SnowSettings.json", this);
        }
        etc...
}

但是,无论哪种方式尝试调用LoadJson()方法,都不会在对象中填充任何值。

当我这样创建一个新类并以完全相同的方式调用它时,该类将使用相同的文件和相同的方法完全按预期填充。我添加了一些父类来测试继承是否破坏了任何东西,因为原始类具有多个继承。

    class TestClass : sub<float>
    {
        public int MaxParticles;
        public string TexturePath { get; set; } = "Textures/default_diffuse";

        public void Load()
        {
            LoadJson("Data/Particles/SnowSettings.json", this);
        }
    }
    class sub<T> : sub2
    {

    }
    class sub2
    {

    }

是什么原因造成的?我已启用错误日志记录,但一无所获。有什么方法可以获取有关填充/未填充内容的日志?还是我该如何调试它,并找出原始人没有被填充的原因?

编辑并回答:

在对其进行了相当复杂的层次结构树调查之后,因此无法完全发布,因此我终于找到了造成我问题的原因。事实证明,其中一个基类具有以下属性:

[JsonObject(MemberSerialization.OptIn)]

具有以下说明

  

仅标记有Newtonsoft.Json.JsonPropertyAttribute或   System.Runtime.Serialization.DataMemberAttribute已序列化。这个   成员序列化模式也可以通过将类标记为   System.Runtime.Serialization.DataContractAttribute。

虽然我可以看到它如何影响序列化,但是它认为还不完全包括反序列化,即使Populate()方法也忽略了它们,即使它们存在于JSON文件中也是如此。我认为这至少应该记录在Tracer中才能找到这种行为。

我已标记答案以启用Tracer作为答案,并在此为我的具体情况提供这些详细信息,因为该答案回答了我提出的实际问题。

1 个答案:

答案 0 :(得分:1)

要找出序列化出了什么问题,可以使用tracing

将序列化程序的TraceWriter属性设置为一个跟踪记录程序,您可以扫描该记录程序以查找可疑消息。

例如:

public void LoadJson(string path, object targetObject)
{
   using (var sw = new StreamReader(path))
   {
        using (var reader = new JsonTextReader(sw))
        {
            var traceWriter = new MemoryTraceWriter();
            var serializer = JsonHelpers.DefaultSerializer;

            serializer.TraceWriter = traceWriter;
            serializer.Populate(reader, targetObject);

            Console.WriteLine(traceWriter);
        }
    }
}

这并不是最佳实践,但是它应该可以提示您调试过程中的问题。