c# - Json.NET 填充一个类,而不是另一个
问题描述
我正在尝试ParticleSystem
使用 Json.Net 填充我的对象对象,如下所示:
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
答案,并在此处针对我的具体情况提供这些详细信息,因为该答案回答了我提出的实际问题。
解决方案
要找出序列化中出了什么问题,您可以使用tracking。
将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);
}
}
}
这并不完全是最佳实践,但它应该在调试过程中提示您的问题所在。
推荐阅读
- docker - 需要帮助在 kubernetes 上的单个 pod 中运行两个操作系统容器
- javascript - 用箭头函数创建对象
- r - row.names(df[c(6193,7812),])- 如何在 R 中显示 data.frame 的某些 row.names?
- php - 使用 ajax 从 json 文件中获取数据时遇到问题
- python - 如果元素不存在,则错误处理 Selenium
- ml.net - 有没有办法重新打开 ML.NET 模型生成器?
- react-redux - react-redux connectAdvanced.js中的反应警告
- php - json输出页面报错cannot be read data from json
- computer-vision - 访问图像子区域
- sympy - 我在哪里可以找到 sympy 代码以供参考