none
循环引用类在WCF中的传递 RRS feed

  • 问题

  • [DataContract]
        public class AB
        {
            [DataMember]
            public IList<BC> BCs { get; set; }
        }

     [DataContract]
        public class BC
        {
            [DataMember]
            public string Name { get; set; }
           
            [DataMember]
            public AB AB;
        }

    这样的类怎么调用
            [OperationContract]
            AB GetAB();

     

    2010年3月29日 5:54

答案

  • [DataContract(IsReference=true)]
        [KnownType(typeof(BC))]
        public class AB
        {
            [DataMember]
            public IList<BC> BCs { get; set; }
        }

     

    ok了,但是我是继承别人一个类,需要基类的IsReference=true,否则继承类无法实现。

    • 已标记为答案 Mog Liang 2010年4月6日 9:29
    2010年3月30日 6:02

全部回复

  • 没做过测试,可能序列化有问题。

    不知道这个可以编译通过不。

     


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2010年3月29日 9:34
    版主
  • 编译可以通过,只是调用时出错。 接收对 http://localhost:8093/Wcf/Service1/ 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。有关详细信息,请参阅服务器日志。 {"基础连接已经关闭: 接收时发生错误。"} {"无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。"} 可能是微软无法识别这样的序列化。递归引用了。
    2010年3月30日 5:15
  • Message = "“Wcf.BC”类型的对象图包含循环,如果禁用引用跟踪,无法对其进行序列化。"

    微软的汉化有个错别字。

    我应该怎样放开引用跟踪

    2010年3月30日 5:38
  • [DataContract(IsReference=true)]
        [KnownType(typeof(BC))]
        public class AB
        {
            [DataMember]
            public IList<BC> BCs { get; set; }
        }

     

    ok了,但是我是继承别人一个类,需要基类的IsReference=true,否则继承类无法实现。

    • 已标记为答案 Mog Liang 2010年4月6日 9:29
    2010年3月30日 6:02
  •  public static void Serialize<T>(T instance, string fileName, IList<Type> knowTypes)
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(T), knowTypes, int.MaxValue, false, true, null);
                using   (XmlWriter writer = new XmlTextWriter(fileName, Encoding.UTF8))
                {
                  serializer.WriteObject(writer, instance);
                }
                  Process.Start(fileName);
               
            }
    2010年3月30日 6:05
  • 理解你的意思了,这个是循环引用的问题,获取或设置一个值,该值指示是否保留对象引用数据。

    如果基类存在引用问题,不能修改属性,确实序列化的时候比较麻烦。

    http://www.zamd.net/2008/05/20/DataContractSerializerAndIsReferenceProperty.aspx

    http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.datacontractattribute.isreference(VS.95).aspx


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2010年3月30日 7:35
    版主