在使用XmlSerializer序列化,或使用JavaScriptSerializer序列化时,如果遇到循环引用问题都会抛出异常。探索内容如下:

//Xml序列化/Javascript序列化,不需要指定 [Serializeble]
public class Child
{
public Child() { }
public string Name { get; set; }
public int Age { get; set; }
public People People
{
get { return new People(); }
set { }
}
}
public class People
{
public People() { }
public string Name { get; set; }
public DateTime Birthday { get; set; }
//[ScriptIgnore]
//[XmlIgnore]
public Child Child
{
get { return new Child(); }
set { }
}
}

一、Json序列化中

People people = new People();
/*
* Js序列化
* 1.如果出现循环引用就会抛出递归异常
* {"已超出 RecursionLimit。"}
*/
/*
* 解决方案1:在Child属性上,指定 [ScriptIgnore]
*/
JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
//默认JSON 字符串的最大长度。 默认长度为 2097152 个字符,等同于 4 MB 的 Unicode 字符串数据。
Console.WriteLine(jsSerializer.MaxJsonLength);
//默认递归级数 100
Console.WriteLine(jsSerializer.RecursionLimit);
string content2 = jsSerializer.Serialize(people);
Console.WriteLine(content2);

二、Xml序列化

/*
* Xml序列化
* 1.如果引用类型为null,序列化时自动忽略
* 2.如果People类和Child类的属性有set访问器则抛出循环引用异常
* 内存溢出异常:{"生成 XML 文档时出错。"}
* {"引发类型为“System.OutOfMemoryException”的异常。"}
* 3.如果都取消set访问器,序列化时就会忽略 Child对象
*/
/*
* 解决方案1:在某个对象引用属性上指定 [XmlIgnore]
* 解决方案2:在某个对象引用属性不使用 set访问器
*/
People people = new People();
People people = new People()
{
Name = "zhangsan",
Birthday = DateTime.Now
};
XmlSerializer xmls = new XmlSerializer(people.GetType());
string content;
using (MemoryStream ms = new MemoryStream())
{
xmls.Serialize(ms, people);
ms.Position = 0;
using (StreamReader reader = new StreamReader(ms))
{
content = reader.ReadToEnd();
}
}
Console.WriteLine(content);