循环引用类在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类型,需要进行显示类型转换。
}

最新文章

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

热门文章

  1. Ubuntu下使用linuxdeployqt打包Qt程序
  2. JPA-save()方法会将字段更新为null的解决方法
  3. Nginx ServerName 配置说明
  4. vs在matlab生成的dll中,load treebigger错误
  5. .Net反射-Type类型扩展
  6. React的一些原则
  7. nginx使用多端口监听多个服务
  8. python cookbook3
  9. [LeetCode] 493. Reverse Pairs 翻转对
  10. [LeetCode] 16. 3Sum Closest 最近三数之和