none
数据契约疑问? RRS feed

  • 问题

  • 看了WCF分布式开发步步为赢(7):WCF数据契约与序列化 后,自己做了实验。

     [DataContract]//数据契约属性声明
        class MyDataContract
        {
            [DataMember(Name = "MyName")]//数据成员标记,支持别名定义
            public string Name
            {
                get;
                set;
            }
            [DataMember(Name = "MyEmail")]//数据成员标记,支持别名定义
            public string Email
            {
                get;
                set;
            }
            [DataMember]//数据成员标记
            public string Mobile
            {
                get;
                set;
            }
            //没有[DataMember]声明,不会被序列化
            public string Address
            {
                get;
                set;
            }
        }
    }


    当我把 [DataContract]注释掉后,在客户端反而能够访问到所有成员。Frank不是说只有声明为DataContract,才能将对象序列化后在服务端和客户端之间传送吗?还是我理解有问题,请指教。谢谢!

    我查看了客户端信息,当我将[DataContract]注释掉时,客户端获取到的是所有成员。而添加[DataContract],不为某成员添加[DataMember],则在客户端就获取不到其信息。感觉好像是[DataContract],[DataMember]是辅助我们对于成员序列化更复杂的需求,不知道我理解对吗?

    2009年8月25日 8:15

答案

  •   这个文章非常不错。
     结论我看了;
    You should use DataContractSerializer whenever possible in Windows Communication Foundation. Its constrained mapping improves interoperability when starting with code. NetDataContractSerializer should only be used when you absolutely need type fidelity across the wire. Alternatively, you should use XmlSerializer when you need backwards compatibility with ASMX types, you need more flexibility in the XML representations, or you're starting with existing schemas that don't meet the [DataContract] mapping constraints.
      我使用的是NET 3.5测试的,可以。但是客户端是基于.NET 平台。WCF服务Host可以启动,而且客户端可以添加服务引用。
      但是客户端多出一个文件WCFClient.ClientProxy.UserDataContract.datasource.这个里面包含了UserDataContract的程序集信息。
     或许WCF在数据契约序列化方面做了改进。我还没有主意到。
      这个文章提到的NetDataContractSerializer。我在现在的MSDN上还没查到。
     
      WCF4.0也做了部分改动。
       谢谢你的补充。我也收获不小~


    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
    • 已标记为答案 Xylon-tj 2009年8月26日 10:45
    2009年8月26日 10:13
    版主

全部回复

  •   我查看代码以后在给你回复。
      客户端是不是已经有添加服务引用的代码了?
      你把这些文件全部删除,按照你的操作,编译服务类,重新启动host.
      然后在给客户端添加服务引用,生成客户端文件。
      你在调用看看。
     
      我现在不太清楚你是否是在老项目的基础上修改的,有没有重新编译服务类。和重新添加服务元数据。
    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
    2009年8月25日 10:46
    版主
  • 刚开始我是在自己项目中调用的,后来发现不太对劲。就下了你给的那个例子,结果也是一样。不知道是不是我上面所说的那种理解?上面我所说的查看客户端信息指的是我们启动host后在客户端添加产生的service reference下的文件。不知道你有没有理解我的意思?
    谢谢

    2009年8月25日 12:13
  • 我理解你的意思,晚上试验以后给你回复~
    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
    2009年8月25日 12:38
    版主
  • Hi,
      我试验了。步骤如下:
    1.删除,[DataContract]标记。
    2.编译。WCF数据契约和服务类
    3.启动托管Host。重新启动托管Host.
      抛出异常:
    Type 'WCFService.UserDataContract' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute.。
      不能被序列化。

     
       这里UserDataContract'因为没有,[DataContract]标记。不符合WCF的数据契约的声明语法。所以无法启动托管宿主。

      你在检查一下你的程序。
      我是用WCF分布式开发步步为赢(7):WCF数据契约与序列化的例子做测试的。

      有疑问在交流~

     
    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
    2009年8月25日 13:52
    版主
  • Frank,我按你的步骤又走了一遍。还是一样,实在找不出问题。还请指教。下面是相关代码

    DataContract.cs
     //[DataContract]//数据契约属性声明             只注释掉了这里
        public class UserDataContract
        {
            [DataMember(Name = "UserName")]//数据成员标记,支持别名定义
            public string Name
            {
                get;
                set;
            }

            [DataMember(Name = "UserEmail")]//数据成员标记,支持别名定义
            public string Email
            {
                get;
                set;
            }
            [DataMember]//数据成员标记
            public string Mobile
            {
                get;
                set;
            }
            //没有[DataMember]声明,不会被序列化
            public string Address
            {
                get;
                set;
            }
        }
    WCFService.cs类没变

    host和config文件也没变。

    按你的意思是将DataContract注释掉后启动host就会报错,但是在我机子这边也很正常。实在找不出问题所在,你能不能把你出错的那个sample发给我呢?谢谢。
    teantuo@gmail.com
    2009年8月26日 2:07
  • 找到了一篇文章,和我之前的理解差不多。

    http://www.cnblogs.com/zlgcool/archive/2008/11/22/1338850.html
    2009年8月26日 3:31
  • 我看了这个文章。
    我只能说我需要试验。
    或许WCF提供了新特性。
    1.昨天测试的代码,我会发出来,给你一份。
    2.它的结论也有人有质疑:不给任何标记将会做XML映射,所有公有属性/字段都会被序列化

    如果真是这样, 理论上所有类都应该能够被序列化, 但事实并非如此.
    问题出在哪里?

    这个问题我也感觉不可理解。
    具体的序列化规则,只能说和Datacontract定义的序列化要求有关系。


    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
    2009年8月26日 4:06
    版主
  • Hi,
      关于他的测试文章。
    1.NET3.5 sp1.这个需要核实一下。
    2.其次,关于数据契约序列化的问题。
     服务端的类:
     public class DeskMesh

        {...   }

      没有标记Datacontract。
       我其实很想知道他的客户端的类DeskMesh。
       代码是什么样子的。
      是怎么获得的?
      难道直接引用服务端的dll?
      是添加元数据生成的客户端代码文件?

      3.此外还有一点,就是这个测试的前提,是不是指在.NET平台上?


    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
    2009年8月26日 4:54
    版主
  • 又找到了点资料:http://www.cnblogs.com/wcfgroup/archive/2008/06/03/1213119.html

    里面介绍wcf中数据的序列化主要有几种方式:

    XmlSerializer,DataContractSerializer ,NetDataContractSerializer

    在WCF通信过程中,如果我们不为某个类添加Datacontract标记,默认它会以XmlSerializer这种机制来序列化数据的(前提是将该类定义为public,这里如果我把public删除,就会出现Frank上面所提到的异常:
    Type 'WCFService.UserDataContract' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute.。)
    此时,能够自动序列化所有公有的字段和属性。

    2009年8月26日 9:17
  •   这个文章非常不错。
     结论我看了;
    You should use DataContractSerializer whenever possible in Windows Communication Foundation. Its constrained mapping improves interoperability when starting with code. NetDataContractSerializer should only be used when you absolutely need type fidelity across the wire. Alternatively, you should use XmlSerializer when you need backwards compatibility with ASMX types, you need more flexibility in the XML representations, or you're starting with existing schemas that don't meet the [DataContract] mapping constraints.
      我使用的是NET 3.5测试的,可以。但是客户端是基于.NET 平台。WCF服务Host可以启动,而且客户端可以添加服务引用。
      但是客户端多出一个文件WCFClient.ClientProxy.UserDataContract.datasource.这个里面包含了UserDataContract的程序集信息。
     或许WCF在数据契约序列化方面做了改进。我还没有主意到。
      这个文章提到的NetDataContractSerializer。我在现在的MSDN上还没查到。
     
      WCF4.0也做了部分改动。
       谢谢你的补充。我也收获不小~


    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
    • 已标记为答案 Xylon-tj 2009年8月26日 10:45
    2009年8月26日 10:13
    版主