以前一直没搞懂为什么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. 一些html页面资料

    一下没有什么重要的,只是我平时积累的一些页面,紧急时或许会有用,相信过一段时间去东宇(公司分公司)了,这些资料页带不走,还不如留在博客里,趁组长级别们开会去了,他们已经开了一个点啦!我的组长去东宇查看 ...

  2. SQL Server xtype

    sysobjects 表 在数据库内创建的每个对象(约束.默认值.日志.规则.存储过程等)在表中占一行.只有在 tempdb 内,每个临时对象才在该表中占一行. 列名 数据类型 描述 name sys ...

  3. textarea 默认文字获取焦点失去焦点

    <textarea name="textarea" cols="" title="contactForm" class="t ...

  4. SQLServer temporary table and table variable

    Temporary tables are created in tempdb.  The name "temporary" is slightly misleading, for ...

  5. 使用openvswitch实现跨主机docker容器互联

    安装openvswitch的步骤请参考上一篇文章:http://www.cnblogs.com/xkops/p/5568167.html 环境:192.168.3.201 node1192.168.3 ...

  6. 不连数据库List分页

    package com.jpsycn.kfwggl.common.crawl; import java.util.ArrayList; import java.util.List; public cl ...

  7. linux内核编译相关

    参考:http://www.arm.linux.org.uk/docs/kerncomp.php 一. 内核编译1) linux 2.4make clean/make mrpropermake dep ...

  8. dojo使用疑难杂症集锦

    最近在用dojo做项目, 把使用过程中遇到的一些问题记录下来, 方便以后查阅, 因为问题不断, 所以持续更新中.......... 嵌套 TabContainer 时会出现样式问题: tab控制样式问 ...

  9. 审计参数 audit_trail

      audit_trail参数定义了在哪里存放审计记录   默认是DB.如果将其设置为NONE,标准数据库审计功能被取消.audit_trail是静态参数,修改后必须重启数据库.   可以设置的值:- ...

  10. Redo丢失场景和处理方法

    Redo丢失场景和处理方法 Type of Failure Status Column of V$LOG Action One member failed in multiplexed group N ...