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来对可序列话数据契约 ...
随机推荐
- 强大的 strace 工具
什么是 strace strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用. Strace是一个简单的跟踪系统调用执行的工具.在其最简单的形式中,它可以从开始到结束跟 ...
- 【MongoDB详细使用教程】三、高级查询
目录 1.使用比较运算符查询 2.使用关键字查询 2.1.in/not in 关键字 2.2.size 关键字 2.3.exists 关键字 2.4.or 关键字 3.模糊查询 4.查询结果排序 5. ...
- 函数arguments讲解
// 总结:1- 函数内部有一个实参 arguments 可以获取所有的实参. //2- arguments是一个伪数组,如果要使用数组的方法, 将它转为真数组 // 3 ...
- 201871010121-王方《面向对象程序设计JAVA》第十五周实验总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...
- Azure产品整理
Azure的文档真是够落地,简明易懂. 计算 Linux 虚拟机:为 Ubuntu.Red Hat 等预配虚拟机 Windows 虚拟机 为 SQL Server.SharePoint 等预配虚拟机 ...
- LG5357 「模板」AC自动机(二次加强版) AC自动机+fail树
问题描述 LG5357 题解 不是fail树的AC自动机复杂度是假的. 把AC自动机搞出来,建立Trie树,树上爆搜一遍就好了. \(\mathrm{Code}\) #include<bits/ ...
- 利用Tengine在树莓派上跑深度学习网络
树莓派是国内比较流行的一款卡片式计算机,但是受限于其硬件配置,用树莓派玩深度学习似乎有些艰难.最近OPENAI为嵌入式设备推出了一款AI框架Tengine,其对于配置的要求相比传统框架降低了很多,我尝 ...
- 组件注册-自定义TypeFilter指定过滤规则
组件注册-自定义TypeFilter指定过滤规则 4.1 FilterType.ANNOTATION 按照注解方式 4.2 FilterType.ASSIGNABLE_TYPE 按照给定的类型 @Co ...
- 洛谷P4593 [TJOI2018]教科书般的亵渎
小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为\(a_i\),且每个怪物血量均不相同,小豆手里有无限张"亵渎".亵渎的效果是对所有的怪造成\(1\)点伤害,如果 ...
- 【搜索】L国的战斗之伞兵
伞兵?SB?嘿嘿嘿 原题传送门 思路 这道题需要采用倒退的思想. 如果a[x][y]无风或可吹至无风区: 那么它南面如果是北风区,则北风区就也是无风或可吹至无风区(实际上就是可吹至无风区). 那么它北 ...