2014-02-20 32 views
1

我有一个对象,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

我认为你的问题的一部分是课程(有先决条件)和“招生”之间的混淆,其中有成绩。入学人数将成为一名学生在任期内参加课程的记录。这将有像出席,成绩,也许测试成绩等属性。 –

+0

@JohnSaunders老实说,这不是我的混乱。这是一个简化的例子,它与一个更大的问题是同构的,因为上下文有一个广泛的熟悉。 – Emily

+0

那么,你在问如何维护对象的身份?此外,您是否有任何循环或多重参考的潜在问题? –

回答

2

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

基本上,在第一时间之后的编码器看到一个特定对象,它会在所得到的JSON发射短截线$id属性与不同的值(即通过$ref链接)。当Json.NET读取JSON时,它将“重新引用”像这样序列化的任何这样的对象。

查看Preserving References示例。

+0

宾果!完善! – Emily

+0

@Arkamis我建议尽量平坦/简化结构,如果可能的话......仅仅因为它支持[在Json.NET]并不意味着它应该被使用,虽然也许这是其中的一种。至少它是一个不同的锤子。 :) – user2864740

+0

我认为这不是一个可怕的解决方案。另一种解决方案是存储密钥,并保存一个单独的课程列表,然后我总是可以通过键查找课程。然而......这样做意味着其他事情有点棘手。 – Emily