我应该如何处理C#到JSON的序列化和循环引用?

我应该如何处理C#到JSON的序列化和循环引用?,c#,.net,json,serialization,C#,.net,Json,Serialization,我正在使用System.Web.Extensions DLL中包含的System.Web.Script.Serialization.JavaScriptSerializer。我有几个循环引用,例如基本的多对多关系和父子关系。我该怎么处理这些?我们的一个想法是用外键替换实际的对象引用。例如,与此相反: public class Node { public Node Parent { get; set; } public ICollection<Node> Children {

我正在使用System.Web.Extensions DLL中包含的System.Web.Script.Serialization.JavaScriptSerializer。我有几个循环引用,例如基本的多对多关系和父子关系。我该怎么处理这些?我们的一个想法是用外键替换实际的对象引用。例如,与此相反:

public class Node {
  public Node Parent { get; set; }
  public ICollection<Node> Children { get; set; }
}
公共类节点{
公共节点父节点{get;set;}
公共ICollection子项{get;set;}
}
我们会这样做:

public class Node {
  public long ParentID { get; set; }
  public ICollection<long> ChildrenIDs { get; set; }
}
公共类节点{
公共长父ID{get;set;}
公共ICollection子节点ID{get;set;}
}
我曾考虑过使用ScriptIgnore属性,但如何在多对多关系中使用它呢?如有意见和建议,将不胜感激。谢谢

编辑:下面是一些多对多关系的示例类

public class Student {
  public long StudentID { get; private set; }
  public ICollection<Class> Classes { get; set; }
}

public class Class { 
  public long ClassID { get; private set; }
  public ICollection<Student> Students { get; set; }
}
公共班级学生{
公共长学生ID{get;private set;}
公共ICollection类{get;set;}
}
公共类{
公共长ClassID{get;私有集;}
公共ICollection学生{get;set;}
}

通常的方法是将[ScriptIgnore]与父节点引用一起使用,如:

public class Node {
  [ScriptIgnore]
  public Node Parent { get; set; }    
  public ICollection<Node> Children { get; set; }
}
公共类节点{
[脚本忽略]
公共节点父节点{get;set;}
公共ICollection子项{get;set;}
}

Json.NET正是我想要的。不过,另一种选择是创建一个匿名类型并将其序列化。

如何使用多对多关系这样的关系来实现这一点?为此,您必须使用Json.NET。它的最新版本支持序列化循环n-to-n关系。在帮助中查看。