反序列化后管理引用

时间:2014-02-20 21:56:38

标签: c# json deserialization

我有一个对象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管理应该引用类型的序列化?

1 个答案:

答案 0 :(得分:2)

如果您希望在序列化中“保留对象图中的引用”,则必须使用可以对链接信息进行编码的工具(或手动过程)。 Json.NET确实可以支持这种“通过引用”序列化。

基本上,在编码器第一次看到特定对象之后,它将发出一个存根$id属性,该属性具有不同的值(通过$ref链接)结果JSON。当Json.NET在其中读取JSON时,它将“重新引用”像这样序列化的任何此类对象。

请参阅Preserving References示例。