【发布时间】:2017-01-25 08:19:25
【问题描述】:
我想知道当内部对象引用根对象列表的项目时是否可以序列化对象。小例子来说明:情况:
class Project
{
public List<Template> Templates { get; set; }
public List<Task> Tasks { get; set; }
}
class Template
{
public string Name { get; set; }
}
class Task
{
public Template Template { get; set; }
}
class Program
{
static void Main(string[] args)
{
var template2 = new Template { Name = "Temp2" };
var project = new Project
{
Templates = new List<Template>
{
new Template {Name = "Temp1"},
template2,
new Template {Name = "Temp3"}
}
};
var task = new Task {Template = template2};
project.Tasks = new List<Task> {task};
Console.WriteLine(ReferenceEquals(project.Templates[1], project.Tasks.First().Template));
var json = JsonConvert.SerializeObject(project);
var projectFromJson =
JsonConvert.DeserializeObject<Project>(
"{\"Templates\":[{\"Name\":\"Temp1\"},{\"Name\":\"Temp2\"},{\"Name\":\"Temp3\"}],\"Tasks\":[{\"Template\":{\"$ref\":\"$.Templates[?@.Name == 'Temp2']\"}}]}");
Console.WriteLine(ReferenceEquals(projectFromJson.Templates[1], projectFromJson.Tasks.First().Template));
Console.Read();
}
}
所以在本例中,我希望具有属性 Template 的 Task 对象将引用 Project 对象模板列表中的 template2 对象。所以在序列化ReferenceEquals之前创建它显示两个对象引用是相等的,但是当反序列化后再次尝试时它返回false,因为Task对象模板属性为null,这意味着JSON.net不要序列化它。
现在看起来同一个 JSON.net JObject 知道 JSONpath 语法,但它不适用于反序列化。我知道有 IReferenceResolver,但我不确定这个对我的情况有何帮助。
那么是否可以使用 JSON.net,也许还有其他序列化程序允许拥有 JSONpath 引用?
【问题讨论】:
标签: c# json serialization json.net