我正在尝试使用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
作为答案,并在此为我的具体情况提供这些详细信息,因为该答案回答了我提出的实际问题。
答案 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);
}
}
}
这并不是最佳实践,但是它应该可以提示您调试过程中的问题。