循环引用类在WCF中的传递

循环引用类在WCF中的传递问题,例如:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 

  [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类型,需要进行显示类型转换。
}

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄