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类型,需要进行显示类型转换。
}
最新文章
- jQuery .attr(";checked";)得undefined 问题解决
- secureCRT背景颜色设置
- NOIP2012 题解
- iOS学习之基础控件
- Windows SEH学习 x86
- Spring中的设计模式
- 使用C#通过调用minitab的COM库自动化生成报表
- Mono Compatibility
- raphael 支持group(简)
- jQuery easyui刷新当前tabs
- 数据库索引------Hash索引的使用限制
- javascript如何自动去除所有空格?
- NetBeans导入项目jar路径错误解决办法
- Java map 详解
- PowerMock单元测试踩坑与总结
- 全系列Unity4.x.x到2017.1.1破解Win&;Mac!最新Unity2017.1.1p3&;4.7.2f1破解!
- Dynamics 365 CRM large instance copy
- 19. SpringBoot_web开发-使用外部Servlet容器&;JSP支持
- Oracle调整内存超出限制出现ORA-27100: shared memory realm already exists问题解决办法
- Eclipse启动Web项目 Tomcat中webapps中没有项目文件夹