wcf序列化嵌套类(如TreeNode)异常原因
循环引用类在WCF中的传递
循环引用类在WCF中的传递问题,例如:
[DataContract]
public class AB
{
public string name {get;set;}
[DataMember]
public IList<AB> ABs { get; set; }
}
这种情况调用WCF接口总是调用失败。
使用WCF序列化方式进行测试,测试代码如下:
try
{
AB a = new AB();
a.name = "p";
a.ABs=new List<AB>();
a.ABs.Add(a);
DataContractSerializer dcs = new DataContractSerializer(typeof(AB));
using (Stream fs = new FileStream("test.soap", FileMode.Create, FileAccess.Write, FileShare.None))
{
dcs.WriteObject(fs, a); //反序列化使用ReadObject方法,但返回的是Object类型,需要进行显示类型转换。
}
}
catch (Exception ex)
{
}
异常的信息为““System.Collections.Generic.List`1[[Beisen.PerformanceCloud.ServiceImp.Tests.AssessmentModuleLibProviderTests+AB, Beisen.PerformanceCloud.ServiceInterfaceTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]”类型的对象图包含循环,如果禁用引用跟踪,择无法对其进行序列化。”
处理方式:
(1)在类上面增加IsReference = true,如果该类有基类,需要基类的IsReference=true,否则继承类无法实现。
[DataContract(IsReference = true)]
public class AB
{
public string name { get; set; }
[DataMember]
public IList<AB> ABs { get; set; }
}
(1)不要让对象有引用关系,比如:
AB a = new AB();
a.name = "p";
a.ABs = new List<AB>();
AB a2 = new AB();// 创建新对象,属性的引用关系也切除
a2.name = a.name;
a2.ABs =new List<AB>();
a.ABs.Add(a2);
DataContractSerializer dcs = new DataContractSerializer(typeof(AB));
using (Stream fs = new FileStream("test.soap", FileMode.Create, FileAccess.Write, FileShare.None))
{
dcs.WriteObject(fs, a); //反序列化使用ReadObject方法,但返回的是Object类型,需要进行显示类型转换。
}
wcf序列化嵌套类(如TreeNode)异常原因的更多相关文章
- Python 之 Json序列化嵌套类
想要用python自已手动序列化嵌套类,就要明白两个问题: 1.Json是什么? 2.Json支持什么类型? 答案显而易见 Json就是嵌套对象 Json在python中支持列表,字典(当然也支持in ...
- C++ 嵌套类使用(一)
一.嵌套类 在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型.之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的 ...
- C++学习笔记(十二):类继承、虚函数、纯虚函数、抽象类和嵌套类
类继承 在C++类继承中,一个派生类可以从一个基类派生,也可以从多个基类派生. 从一个基类派生的继承称为单继承:从多个基类派生的继承称为多继承. //单继承的定义 class B:public A { ...
- C++学习之嵌套类和局部类
C++学习之嵌套类和局部类 局部类 在一个函数体内定义的类称为局部类. 局部类中只能使用它的外围作用域中的对象和函数进行联系,因为外围作用域中的变量与该局部类的对象无关.在定义局部类时需要注意:局部类 ...
- 嵌套类,PIMPL
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- Wcf序列化的循环引用问题1
1.Wcf数据契约序列化,使用的类DataContractSerializer 默认如果类不指定[DataContract],则序列化类的所有字段,并且在出现循环引用的时候回抛出异常,服务终止 msd ...
- Java基础教程(14)--嵌套类
Java允许在一个类中定义另外一个类,这样的类被称为嵌套类,就像下面这样: class OuterClass { ... class NestedClass { ... } } 嵌套类分为两种 ...
- JAVA 嵌套类和内部类
一.什么是嵌套类及内部类? 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型: 静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类, ...
- WCF序列化
在WCF中,提供了专门用来序列化和反序列操作的类,该类就是DataContractSerializer类.一般而言,WCF会自动选择使用DataContractSerializer来对可序列话数据契约 ...
随机推荐
- 史上最全的Spring Boot Cache使用与整合
一:Spring缓存抽象# Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接 ...
- Python环境安装与基础语法(1)——计算机基础知识
Python安装 pip #包管理工具 pip install #安装包 pip list #查看包 IPython #增强的python shell,自动补全,自动缩进,支持shell,增加了很多函 ...
- 005-OpenStack-网络服务
OpenStack-网络服务 [基于此文章的环境]点我快速打开文章 1.控制节点(controller) 1.1 创库授权 neutron mysql CREATE DATABASE neutron; ...
- OpenGL入门(一):使用GLFW创建简单的窗口
如果使用QT,那么创建一个OpenGL渲染窗口其实很容易,不过出于初学的角度,使用GLFW库来创建新窗口. 1. 下载并配置GLFW GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体 ...
- P5008 [yLOI2018] 锦鲤抄(Tarjan+贪心)
洛谷 题意: 给出一个有向图,每次可以删除存在入度的点及其出边,每次删除一个点可以获得其权值. 问最终能够获得的最大权值为多少. 思路: 考虑DAG:我们直接倒着拓扑序来选,即可将所有入度不为\(0\ ...
- Go语言调度器之创建main goroutine(13)
本文是<Go语言调度器源代码情景分析>系列的第13篇,也是第二章的第3小节. 上一节我们分析了调度器的初始化,这一节我们来看程序中的第一个goroutine是如何创建的. 创建main g ...
- 201871020225-牟星源《面向对象程序设计(java)》第十周学习总结
201871020225-牟星源<面向对象程序设计(java)>第十周学习总结 博文正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu- ...
- RST复位报文
复位报文段: 一些特殊情况,TCP一端向另一端发送复位报文,以通知对方关闭链接或者重新建立链接. 产生复位报文的三种情况: 1. 当客户端访问一个不存在的端口时,目标主机会给客户端发送一个复位报文段. ...
- Golang调用Python
https://yq.aliyun.com/articles/117329 Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言.Python很适合让搞算法的写写模型, ...
- luoguP4008 [NOI2003]文本编辑器
题意 splay维护即可 code: #include<bits/stdc++.h> using namespace std; const int maxn=2000010; int T, ...