以前一直没搞懂为什么C#在做对象序列化时(Json序列化,XML序列化等)有时候会出现循环引用的问题,下面写了个例子,类People有一个属性引用了类Child,而类Child也有一个属性引用了类People,并且两个属性的get访问器中都会new一个彼此类型的对象,这样在访问People类的Child属性的时候就会new一个Child对象,在访问Child类的People属性的时候又会new一个People对象。所以C#序列化方法在序列化People类的Child属性时又会去序列化Child属性返回的Child对象,而在序列化Child类的People属性时又会去序列化People属返回的People对象。那么C#序列化方法在检测People类和Child类的属性的时候就会不停地去构造(不停地new)且不停地序列化People对象和Child对象,形成一个死循环:People->Child->People->Child->People....,所以就会抛出循环引用的异常,注意下面XML序列化的时候只有属性声明了set访问器才会出现循环引用的异常,说明C#自带的XmlSerializer比JavaScriptSerializer要更先进一些。。。

类Child:

 using System.Xml;
using System.Xml.Serialization; namespace SE
{
[XmlRoot]
public class Child
{
public Child()
{
} [XmlElement]
public string Name { get; set; } [XmlElement]
public int Age { get; set; } [XmlElement]
public People People
{
//注意属性声明了set访问器XmlSerializer在序列化时才会出现循环引用异常
/*set
{ }*/
get
{
return new People();
}
}
}
}

类People:

 using System.Xml;
using System.Xml.Serialization; namespace SE
{
[XmlRoot]
public class People
{
public People()
{
} [XmlElement]
public string Name { get; set; } [XmlElement]
public int Age { get; set; } [XmlElement]
public Child Child
{
//注意属性声明了set访问器XmlSerializer在序列化时才会出现循环引用异常
/*set
{ }*/
get
{
return new Child();
}
}
}
}

序列化调用代码:

 using System;
using System.Web.Script.Serialization;
using System.IO;
using System.Xml.Serialization; namespace SE
{
class Program
{
static void Main(string[] args)
{
People P = new People() { Name = "James", Age = };
XmlSerializer xmls = new XmlSerializer(P.GetType());
string content;
using (MemoryStream ms = new MemoryStream())
{
xmls.Serialize(ms, P);//如果People类和Child类的属性有set访问器则抛出循环引用异常
ms.Position = ;
using (StreamReader s = new StreamReader(ms))
{
content = s.ReadToEnd();
}
} Console.ReadLine(); JavaScriptSerializer js = new JavaScriptSerializer();
content=js.Serialize(P);//抛出循环引用异常
Console.ReadLine();
}
}
}

一个C#序列化时循环引用的问题的更多相关文章

  1. 解决MVC Json序列化的循环引用问题/EF Json序列化循引用问题---Newtonsoft.Json

    1..Net开源Json序列化工具Newtonsoft.Json中提供了解决序列化的循环引用问题: 方式1:指定Json序列化配置为 ReferenceLoopHandling.Ignore 方式2: ...

  2. EntityFramework中Json序列化的循环引用问题解决--Newtonsoft.Json

    1.在使用EF时,由于数据库主外键关联,将对象进行Json序列化时会遇到循环引用的问题 //EF 中由于数据库主外键关联,对象的序列化经常出现循环引用问题 //使用.Net 自带的序列化工具,序列化出 ...

  3. lua序列化(支持循环引用)

    lua序列化 支持key类型为string, number 支持value类型为string, number, table, boolean 支持循环引用 支持加密序列化 支持loadstring反序 ...

  4. Xml序列化自引用/循环引用问题2

    1.类定义: public class Student { public int ID { get; set; } public string Name { get; set; } //[XmlIgn ...

  5. Xml序列化自引用/循环引用问题1

    1.定义类 public class Student { public int ID { get; set; } public string Name { get; set; } //[XmlIgno ...

  6. Wcf序列化的循环引用问题1

    1.Wcf数据契约序列化,使用的类DataContractSerializer 默认如果类不指定[DataContract],则序列化类的所有字段,并且在出现循环引用的时候回抛出异常,服务终止 msd ...

  7. 使用 Entity Framework 返回 JsonResult 时循环引用的避免【EF 转 JSON】

    var ui = (from u in _db.USER_INFO select u).FirstOrDefault(); // 单个实体的用法 ZRQCommon.EntitiesTools e = ...

  8. Atitit.json xml 序列化循环引用解决方案json

    Atitit.json xml 序列化循环引用解决方案json 1. 循环引用1 2. 序列化循环引用解决方法1 2.1. 自定义序列化器1 2.2. 排除策略1 2.3. 设置序列化层次,一般3级别 ...

  9. 解决.Net MVC EntityFramework Json 序列化循环引用问题.

    以前都是到处看博客,今天小菜也做点贡献,希望能帮到大家. 废话不多说,直接进入正题. 用过.net MVC的同学应该都被json序列化报循环引用错误这个问题骚扰过.网上有一些解决办法,但是都治标不治本 ...

随机推荐

  1. Marriage Match IV---hdu3416(spfa + Dinic)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3416 有一个有向图,n个点,m条边,给一个起点和终点,求出从起点到终点的最短路共有几条,每 ...

  2. Round and Round We Go

    http://acm.hdu.edu.cn/showproblem.php?pid=1313 考查大整数与小整数相乘 #include<iostream> #include<cstd ...

  3. 将Excel导入SQL Server 只能导入数字,其他数据变为NULL怎么解决?

    先新建一个TXT文件,把数据粘贴进去 再新建一个Excel文件,在菜单栏中选Data再选From Text 找到txt文件,点import 一定要选Text 点Finish,点OK. 接下来在往数据库 ...

  4. SpringMVC中的controller默认是单例的原因

    http://lavasoft.blog.51cto.com/62575/1394669/ 1.性能 :单例不用每次new浪费资源时间. 2.不需要:一般controller中不会定义属性这样单例就不 ...

  5. saltstack之(六)配置管理state

    配置管理是saltstack工具最重要的模块之一,也是学习saltstack之后使用最多的一个功能.可以轻松实现上百台上千台甚至上万台服务器的管理工作. 1.使用state模块进行配置管理,编写sls ...

  6. eclipse打开jar包出现乱码问题解决方法

    今天做项目时候,用eclipse打开.class文件出现乱码问题.jar编码和本地编辑器编码格式不对造成的错误. 首先我们打开eclipse,点击菜单下的window-->preferences ...

  7. web双机热备添加心跳检测ip的时候填了网关导致外网ip不能上网

    web双机热备添加心跳检测ip的时候填了网关导致外网ip不能上网 1 连接 机器其他机器, 通过机房做的服务器的局域网,ssh到这台的局域网ip,删除网卡配置文件的网关哪一行,重启网卡. 2 如果没有 ...

  8. 认识C和内存管理

    认识C和内存管理 C程序内存空间分为下面5类: stack栈: 存放着局部变量和函数参数等数据,向下生长 (可读可写可执行) heap堆:  给动态分配内存使用,向上生长 (可读可写可执行) bss ...

  9. Servlet+Jsp实现图片或文件的上传功能

    首先,我们创建一个新的web工程,在工程的WebRoot目录下新建一个upload文件夹,这样当我们将该工程部署到服务器上时,服务器便也生成个upload文件夹,用来存放上传的资源. 然后,在WebR ...

  10. Java遇见HTML——JSP篇之商品浏览记录的实现

    一.项目总体介绍 使用Cookie实现商品浏览记录. 要实现这个程序采取的是Model1(Jsp+JavaBean)架构实现,具体步骤: 首先要有个数据库,商品表,操作数据库的一个类DBHelper类 ...