我有一个对象Course
。课程作为一个属性,包含其他必备课程列表:
public class Course
{
public List<Course> Prereqs { get; set; }
...
}
我在我的应用程序中创建了一个课程列表,并将其序列化。该列表稍后被加载和反序列化。
假设我有两个课程:微积分1和微积分2.微积分1没有先决条件,微积分2有微积分1作为先决条件。我的应用程序创建了一个名为Curriculum
的列表:List<Course> Curriculum = JsonConvert.Deserialize<List<Course>>(serializedList);
现在,假设我想将“微积分1”的标题从“微积分1”更改为“单变量微积分”(也就是说,让我们假装,列表中的第一个元素):
Course Math101 = Curriculum[0];
Math101.CourseName = "Single Variable Calculus";
但是,如果我这样做:Curriculum[1].Prerequisites[0].CourseName; \\ spit out the CourseName for Math101, as recorded as a pre-req for Math102
那么我得到“微积分1”。
这是因为序列化Curriculum
时,它会分别序列化Curriculum[0]
(Calc 1)和Curriculum[1].Prerequisite[0]
(也是Calc 1)。
我的问题有没有一种简单的方法可以使用C#和JSON管理应该引用类型的序列化?
答案 0 :(得分:2)
如果您希望在序列化中“保留对象图中的引用”,则必须使用可以对链接信息进行编码的工具(或手动过程)。 Json.NET确实可以支持这种“通过引用”序列化。
基本上,在编码器第一次看到特定对象之后,它将发出一个存根$id
属性,该属性具有不同的值(通过$ref
链接)结果JSON。当Json.NET在其中读取JSON时,它将“重新引用”像这样序列化的任何此类对象。
请参阅Preserving References示例。