C# 我可以向复杂类型添加WCF DataContract吗?

C# 我可以向复杂类型添加WCF DataContract吗?,c#,.net,wcf,visual-studio,datacontract,C#,.net,Wcf,Visual Studio,Datacontract,我有一个复杂的数据类型,包括许多函数,以及常用的get和get方法。如果我可以使用WCF,那么我的客户也可以使用这种数据类型,那么我的生活就会轻松得多 是吗 忽略所有操作,仅将[DataMemeber]放在需要的地方 将有问题的类放入共享库程序集中,以便客户端和服务器都可以访问 谢谢, 罗伯托 另外,我意识到这个问题的措辞可能没有它可能的那么好 通过WCF边界传输的所有内容都是序列化的内容,即类的状态。这些方法不会太简单。因此,如果您需要它们在双方都可用,那么您将需要一个您建议的共享库 添加服务

我有一个复杂的数据类型,包括许多函数,以及常用的get和get方法。如果我可以使用WCF,那么我的客户也可以使用这种数据类型,那么我的生活就会轻松得多

是吗

  • 忽略所有操作,仅将
    [DataMemeber]
    放在需要的地方

  • 将有问题的类放入共享库程序集中,以便客户端和服务器都可以访问

  • 谢谢, 罗伯托


    另外,我意识到这个问题的措辞可能没有它可能的那么好

    通过WCF边界传输的所有内容都是序列化的内容,即类的状态。这些方法不会太简单。因此,如果您需要它们在双方都可用,那么您将需要一个您建议的共享库


    添加服务引用时,可以选择重用数据类型,在这种情况下,WCF将反序列化到共享类中,并完成方法。但实际上只有字段值跨边界传输。

    简短回答:是的。WCF像champ一样处理复杂类型。在传递复杂类型时,您希望只关注所传递的数据。如果您的客户端不共享DLL,则更重要的是只关注正在传递的数据(而不是任何其他操作),因为客户端将只获取复杂类型的数据成员的副本

    我猜你有Java背景吧?使用WCF,您需要使用DataMember属性标记字段,或者(更好的是)将get/set方法更改为properties

    例如,而不是:

    [DataContract]
    public class Foo
    {
       [DataMember]
       private string bar;
    
       public string GetBar()
       {
          return bar;
       }
    
       public void SetBar(string b)
       {
          bar = b;
       }
    }
    
    您可以使用以下选项:

    [DataContract]
    public class Foo
    {
       [DataMember]
       public string Bar { get; set; }
    }
    

    数据契约的最佳实践是它是一个契约——只包含数据,不包含任何行为。第二个最佳实践是使用[DataMember]装饰类,并将其保留在服务器上-让客户端使用代理副本。

    好的,它是上述所有答案的组合

  • 将数据类粘贴到共享程序集中,从客户端和服务器项目引用
  • 确保在“配置服务引用”对话框中选中了“引用程序集中的重用类型”项
  • 在每个数据契约的开始处放置一个[KnownType]属性 代码如下所示:

    [DataContract]
    [KnownType(typeof(WHS2SmugmugShared.Photo))]
    [KnownType(typeof(WHS2SmugmugShared.PhotoInfo))]
    public class Photo
    {
    //code here
    }
    
    在上面的例子中,我在Photo类中使用PhotoInfo。PhotoInfo在类文件中没有与其关联的KnownType属性。而且这似乎不是必需的


    这允许您序列化复杂类型,但仍保留其操作

    用serializable属性修饰所有此类类型。因此,您不需要为参与WCF服务的每个复杂类放置[DataContract]属性

    在WCF客户端添加包含这些类型的dll,并让代理重用这些类,而不是重新生成反序列化所需的类。 如果在代理中添加了任何类型,请将其删除并从dll中使用。 通过这种方式,我可以轻松地共享我的复杂类型和服务。
    但它仅适用于您可以将您的类型作为单独的dll进行shrae的情况。

    我假设这将出现在“配置服务引用”对话框中??将其设置为在所有引用的程序集中重用类型。这是正确的吗??