一个C#序列化时循环引用的问题
以前一直没搞懂为什么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#序列化时循环引用的问题的更多相关文章
- 解决MVC Json序列化的循环引用问题/EF Json序列化循引用问题---Newtonsoft.Json
1..Net开源Json序列化工具Newtonsoft.Json中提供了解决序列化的循环引用问题: 方式1:指定Json序列化配置为 ReferenceLoopHandling.Ignore 方式2: ...
- EntityFramework中Json序列化的循环引用问题解决--Newtonsoft.Json
1.在使用EF时,由于数据库主外键关联,将对象进行Json序列化时会遇到循环引用的问题 //EF 中由于数据库主外键关联,对象的序列化经常出现循环引用问题 //使用.Net 自带的序列化工具,序列化出 ...
- lua序列化(支持循环引用)
lua序列化 支持key类型为string, number 支持value类型为string, number, table, boolean 支持循环引用 支持加密序列化 支持loadstring反序 ...
- Xml序列化自引用/循环引用问题2
1.类定义: public class Student { public int ID { get; set; } public string Name { get; set; } //[XmlIgn ...
- Xml序列化自引用/循环引用问题1
1.定义类 public class Student { public int ID { get; set; } public string Name { get; set; } //[XmlIgno ...
- Wcf序列化的循环引用问题1
1.Wcf数据契约序列化,使用的类DataContractSerializer 默认如果类不指定[DataContract],则序列化类的所有字段,并且在出现循环引用的时候回抛出异常,服务终止 msd ...
- 使用 Entity Framework 返回 JsonResult 时循环引用的避免【EF 转 JSON】
var ui = (from u in _db.USER_INFO select u).FirstOrDefault(); // 单个实体的用法 ZRQCommon.EntitiesTools e = ...
- Atitit.json xml 序列化循环引用解决方案json
Atitit.json xml 序列化循环引用解决方案json 1. 循环引用1 2. 序列化循环引用解决方法1 2.1. 自定义序列化器1 2.2. 排除策略1 2.3. 设置序列化层次,一般3级别 ...
- 解决.Net MVC EntityFramework Json 序列化循环引用问题.
以前都是到处看博客,今天小菜也做点贡献,希望能帮到大家. 废话不多说,直接进入正题. 用过.net MVC的同学应该都被json序列化报循环引用错误这个问题骚扰过.网上有一些解决办法,但是都治标不治本 ...
随机推荐
- 一些html页面资料
一下没有什么重要的,只是我平时积累的一些页面,紧急时或许会有用,相信过一段时间去东宇(公司分公司)了,这些资料页带不走,还不如留在博客里,趁组长级别们开会去了,他们已经开了一个点啦!我的组长去东宇查看 ...
- SQL Server xtype
sysobjects 表 在数据库内创建的每个对象(约束.默认值.日志.规则.存储过程等)在表中占一行.只有在 tempdb 内,每个临时对象才在该表中占一行. 列名 数据类型 描述 name sys ...
- textarea 默认文字获取焦点失去焦点
<textarea name="textarea" cols="" title="contactForm" class="t ...
- SQLServer temporary table and table variable
Temporary tables are created in tempdb. The name "temporary" is slightly misleading, for ...
- 使用openvswitch实现跨主机docker容器互联
安装openvswitch的步骤请参考上一篇文章:http://www.cnblogs.com/xkops/p/5568167.html 环境:192.168.3.201 node1192.168.3 ...
- 不连数据库List分页
package com.jpsycn.kfwggl.common.crawl; import java.util.ArrayList; import java.util.List; public cl ...
- linux内核编译相关
参考:http://www.arm.linux.org.uk/docs/kerncomp.php 一. 内核编译1) linux 2.4make clean/make mrpropermake dep ...
- dojo使用疑难杂症集锦
最近在用dojo做项目, 把使用过程中遇到的一些问题记录下来, 方便以后查阅, 因为问题不断, 所以持续更新中.......... 嵌套 TabContainer 时会出现样式问题: tab控制样式问 ...
- 审计参数 audit_trail
audit_trail参数定义了在哪里存放审计记录 默认是DB.如果将其设置为NONE,标准数据库审计功能被取消.audit_trail是静态参数,修改后必须重启数据库. 可以设置的值:- ...
- Redo丢失场景和处理方法
Redo丢失场景和处理方法 Type of Failure Status Column of V$LOG Action One member failed in multiplexed group N ...