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来对可序列话数据契约 ...
随机推荐
- c# 根据一个给定经纬度的点和距离,搜索附近5公里范围的地点
功能需求:需要查询一个站点(已知该站点经纬度)5公里范围内的其它站点. 方 法 一 :对每条记录,去进行遍历,跟数据库中的每一个点进行距离计算,当距离小于5公里时,认为匹配(效率极其低下,耗时长). ...
- 4-7 3D绘图
In [1]: import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D % ...
- Confluence 6.9.0 安装
平台环境:centos 7.6 数据库版本:mysql-5.7.26,提前安装好,安装步骤略. 软件版本:Confluence6.9.0 所需软件:提前下载到本地电脑 atlassian-conflu ...
- CornerNet: Detecting Objects as Paired Keypoints
CornerNet是一种anchor free的目标检测方法,不需要设置anchor,而是通过检测关键点(Keypoints),即目标的左上角(Top-Left Corners)和右下角(Bottom ...
- linux 环境下 apache tomcat 安装jenkins
参考文档: https://blog.51cto.com/12629984/1980034 https://www.cnblogs.com/lxs1314/p/8567652.html https:/ ...
- flask POOL,websocket握手
一.POOL Pool就是为了多线程访问数据库,减少数据库压力 回顾pymysql import pymysql #建立连接 mysql_conn = pymysql.connect(host=&qu ...
- woocommerce根据标题获取相关产品
我们知道woocommerce的相关文章是根据分类category或标签tag来获取的,能不能实现根据标题来调取相关产品呢?get_posts() 函数可以根据库存.价格.自定义项.搜索条件等不同的标 ...
- golang 登录
用户的两种登录模式 1.LDAP登录 //ldapLogin 通过LDAP登陆 func (m *Member) ldapLogin(account string, password string) ...
- Golang调用Python
https://yq.aliyun.com/articles/117329 Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言.Python很适合让搞算法的写写模型, ...
- IDEA中SonarLint的安装与使用
一.SonarLint插件的安装 1.1在线安装 (1)在IDEA菜单栏选择File->Settings,左边栏选择Plugins (2)在线安装选择Browse repositories,搜索 ...