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

C# Json.NET填充一个类,但不填充另一个类,c#,json.net,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(rea

我正在尝试使用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
}
这是课程的一部分(整个内容太大,无法发布)


但是,无论我尝试以何种方式调用
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
    {

    }
其中有以下描述

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

虽然我可以看到这对序列化的影响,但它认为还不完全清楚这是否包括反序列化,甚至
Populate()
方法也会忽略它们,即使它们存在于JSON文件中。我认为这至少应该记录在跟踪程序中,以发现这种行为


我已将答案标记为启用
跟踪器作为答案,并在此处为我的具体案例提供这些详细信息,因为该答案回答了我提出的实际问题。

要找出序列化中的错误,可以使用

将序列化程序的
TraceWriter
属性设置为可以扫描可疑邮件的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);
        }
    }
}

这并不完全是最佳实践,但它应该会提示您调试过程中的问题所在。

您可以发布一条吗?您的代码没有编译和/或存在我们不得不猜测的漏洞。由于类很长并且是长层次结构的一部分,所以很难重现,因此我完全理解重现和调试的难度。代码示例更多的是提供一些上下文。这就是为什么我要询问任何可能的原因,以及一种从
Populate
获取错误/日志的方法,以便我可以查看是否有任何问题。如果没有其他方法,我可能不得不尝试提取和复制代码,但我认为这与类的复杂性有关。“没有值填充到对象中。”这是在LoadJson方法还是调用对象中?如果希望更改存在于LoadJson调用之外,是否应该在“this”对象上传递byref?这是什么原因造成的?--我们需要看医生来帮助你。如果您让我们猜测它可能是1)您有一些只读属性,这些属性只能通过参数化构造函数填充,而
Populate()
不会调用参数化构造函数,因为对象已经被构造;2) 您的根对象有一个
JsonConverter
,但是
Populate()
从未使用过根对象的转换器;3) 您有一个较低级别的
JsonConverter
,其
ReadJson()
方法未正确使用传入的
existingValue
;4) 或者别的什么。我们不能真正回答一个不具体的问题。这取决于你如何从头开始创建一个由两个简单类组成的层次结构,看看你是否得到了在真实示例中看到的行为。如果是,请张贴。如果没有,试着一个接一个地增加一些真实例子的特殊性。例如,添加私有字段、添加readony字段、添加构造函数,直到您在MCVE中看到真实示例中的行为。但所有这些你都需要做。这就是创建MCVE的意义。谢谢,这正是我想要的。但是tracewriter似乎没有报告任何错误,但是没有填充任何属性?日志如下所示:
2018-09-14T17:08:04.753信息已开始反序列化jsmars.Game3D.ParticleSystem。路径“混合状态”,第2行,位置15。2018-09-14T17:08:04.760信息已完成对jsmars.Game3D.ParticleSystem的反序列化。路径“”,第40行,位置1。
加上完整的JSON文件后,对于工作的较小对象,调试消息看起来是否不同?事实上确实如此!working对象列出了我正在使用的所有自定义转换器。很奇怪。有什么原因吗?以下是两个日志:我已将其标记为答案,因为它回答了我关于如何获得更多日志的问题,我的解决方案的详细信息已编辑到我的问题中。
[JsonObject(MemberSerialization.OptIn)]
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);
        }
    }
}