1.Wcf数据契约序列化,使用的类DataContractSerializer

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

msdn文档说明:https://msdn.microsoft.com/library/system.runtime.serialization.datacontractserializer.aspx

/*
* Wcf 数据契约序列化使用“DataContractSerializer”,底层是xml序列化
* 1.如果类上不指定 [DataContract],默认序列化,对象的所有属性(包括null的)
* 2.如果类上指定 [DataContract],序列化只检测 属性有 [DataMember] 的
* 3.没有显示指定忽略某字段的方式
*/
//创建班级
Grade gradeOne = new Grade() { GradeID = , GradeName = "班级1" };
gradeOne.Students = new List<Student>();
//添加班级下的学生
Student stu = new Student();
stu.ID = ;
stu.Name = "张三";
//设置学生所属的班级
/*
* 1.注意:如果当前子类的父类对象引用了当前父类对象抛出循环引用异常
* 解决方法1: 对于需要序列化的类显示指定契约标识 [DataContract]
* 并且忽略 子类的父类对象,
* 也就是 对 Grade 不指定 [DataMember]
*/
/*
* 解决方法2:
* 在类的方法标记使用 [DataContract(IsReference = true)]
* IsReference:如果使用标准 XML 保留对象引用数据,则为 true;否则为 false
*/
stu.Grade = gradeOne;
gradeOne.Students.Add(stu);
DataContractSerializer serializer = new DataContractSerializer(gradeOne.GetType());
string result = null;
using (MemoryStream s = new MemoryStream())
{
serializer.WriteObject(s, gradeOne);
s.Seek(, SeekOrigin.Begin);
using (StreamReader r = new StreamReader(s))
{
result = r.ReadToEnd();
}
}
Console.WriteLine(result);

默认设置(出现异常)

public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public Grade Grade { get; set; }
}
public class Grade
{
public int GradeID { get; set; }
public string GradeName { get; set; }
public List<Student> Students { get; set; }
}

解决方法1,忽略导致循环引用的属性:

这样的缺点:就是在客户端获取到学生对象,不能直接也得到学生所属的班级对象

[DataContract]
public class Student
{
[DataMember]
public int ID { get; set; }
[DataMember]
public string Name { get; set; } [DataMember]
public Grade Grade { get; set; }
}
[DataContract]
public class Grade
{
[DataMember]
public int GradeID { get; set; }
[DataMember]
public string GradeName { get; set; }
[DataMember]
public List<Student> Students { get; set; }
}

序列化结果:

<?xml version="1.0" encoding="utf-8"?>
<Grade xmlns="http://schemas.datacontract.org/2004/07/Test" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<GradeID>1</GradeID>
<GradeName>班级1</GradeName>
<Students>
<Student>
<Grade i:nil="true"/>
<ID>1</ID>
<Name>张三</Name>
</Student>
</Students>
</Grade>

解决方法2(推荐),在DataContract上使用IsReference参数,并且设置为true,

互操作引用说明:https://msdn.microsoft.com/zh-cn/library/cc656708(v=vs.110).aspx

IsReferences:如果使用标准 XML 保留对象引用数据,则为 true;否则为 false。

[DataContract(IsReference = true)]
public class Student
{
[DataMember]
public int ID { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public Grade Grade { get; set; }
} [DataContract(IsReference = true)]
public class Grade
{
[DataMember]
public int GradeID { get; set; }
[DataMember]
public string GradeName { get; set; }
[DataMember]
public List<Student> Students { get; set; }
}

或者在初始化对象的时候指定

DataContractSerializer serializer = new DataContractSerializer(typeof(Parent),
"Parent",
string.Empty,
null,
int.MaxValue,
false,
true,
null,
null);

序列化结果:

<?xml version="1.0" encoding="utf-8"?>
<Grade xmlns="http://schemas.datacontract.org/2004/07/Test" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"
z:Id="i1">
<GradeID>1</GradeID>
<GradeName>班级1</GradeName>
<Students>
<Student z:Id="i2">
<Grade z:Ref="i1"/>
<ID>1</ID>
<Name>张三</Name>
</Student>
</Students>
</Grade>

Wcf序列化的循环引用问题1的更多相关文章

  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. 一个C#序列化时循环引用的问题

    以前一直没搞懂为什么C#在做对象序列化时(Json序列化,XML序列化等)有时候会出现循环引用的问题,下面写了个例子,类People有一个属性引用了类Child,而类Child也有一个属性引用了类Pe ...

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

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

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

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

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

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

  8. WebApi-JSON序列化循环引用

    Overview 最近被序列化,循环引用的问题,让我浑身酸爽.遇到这种异常是在搭建WebApi的时候,当我返回Linq实例类集合的时候出现的. 下定决心要解决这个问题.循环引用引起的原因是: 比如说: ...

  9. 解决ASP.NET MVC返回的JsonResult 中 日期类型数据格式问题,和返回的属性名称转为“驼峰命名法”和循环引用问题

    DateTime类型数据格式问题 问题 在使用ASP.NET MVC 在写项目的时候发现,返回给前端的JSON数据,日期类型是 Date(121454578784541) 的格式,需要前端来转换一下才 ...

随机推荐

  1. @font-face扒站的步骤

    今天模仿百度首页手机版的时候遇到的@font-face的问题,现在整理一下. 问题:图中红色区域,在拷贝F12样式的时候,并没有出现这些小图标.        图1:百度的效果             ...

  2. CSS 去除浏览器默认 轮廓外框

    在默认情况下,点击 a 标签,input,或者添加click事件的时候,浏览器留下一个轮廓外框(chrome之下为蓝色)~ 然而这些默认的轮廓外框,有时候很影响美观,并不是我们想保留的. 我们应如何消 ...

  3. jquery easy ui 学习 (7) TreeGrid Actions

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. python学习第十六天 --继承进阶篇

    这一章节主要讲解面向对象高级编程->继承进阶篇,包括类多继承介绍和继承经典类和新式类属性的查找顺序不同之处. 多继承 上一章节我们讲到继承,子类继承父类,可以拥有父类的属性和方法,也可以进行扩展 ...

  5. tomcat正常启动,但IP不能访问web。ping IP地址,一直超时。 用ipconfig命令修复TCP/IP的配置信息

    今天遇到一个好奇葩的问题  好吧是昨天遇到的一直没找到解决办法(`へ´) tomcat正常启动,但是通过IP不能访问web 用IP地址就是不行  (:′⌒`)  打不开 localhost就可以    ...

  6. struts2整合spring的思路

    struts2整合spring有有两种策略: >sping容器负责管理控制器Action,并利用依赖注入为控制器注入业务逻辑组件. >利用spring的自动装配,Action将自动会从Sp ...

  7. keil优化论

    谈到优化,其实很多人都哭笑不得,因为在一个C51软件工程师的生涯中,总要被KEIL的优化耍那么一次到几次.我被耍过,想必看着文章的你也被耍过,如果你回答说不,那只能说你写的C51程序不多! 看看KEI ...

  8. HDOJ 1028 Ignatius and the Princess III(递推)

    Problem Description "Well, it seems the first problem is too easy. I will let you know how fool ...

  9. Python学习打算

    背景:本人用python写自动化脚本,基础的东西都会啦.但是呢,鉴于年轻应该好好学习,所以打算再买一本python书籍用来精读. Python 好的博客: Python快速教程(好多,一点也不快速): ...

  10. iOS speex

    1. http://www.cocoachina.com/bbs/read.php?tid=114755 2, http://blog.csdn.net/jiangyiaxiu/article/det ...