2011-05-31 42 views
1

有关WCF中DataContract(s)的数千个问题,特别注意涉及继承的情况。 但是我没有找到任何关于特定情况的例子,这些例子都是我在这里提供的一个概述。WCF中涉及DataContract的复杂情况

考虑应用于在WCF服务通信使用的类型下面DataContract(代码1)

// Data contract for my comm type 
[DataContract] 
public class MyCommsType { 
    [DataMember] 
    public Type1 field1; 
    [DataMember] 
    public Type2 field2; 
    [DataMember] 
    public Type1 field3; 
    [DataMember] 
    public Type2 field4; 
    [DataMember] 
    public List<Type2> field5; 
    [DataMember] 
    public List<Type1> field6; 
} 
// Used types 
public class Type1 { 
    ... 
} 
public class Type2 { 
    ... 
} 

该类型应该是这里使用(代码1.1)

[ServiceContract] 
public interface IMyService { 
    [OperationContract] 
    string CommOp1(MyCommType mct); 
    [OperationContract] 
    MyCommType CommOp2(string s); 
} 

我的个人类型MyCommsType是一种涉及通信类型。但是,当然,CLR不知道如何序列化它,因为它不是基类库中的本地类型。 MyCommsType需要数据合同,所以我提供了它。然而,这种艺术状态并不足以让事物发挥作用(没有任何工作是这样的)。

为什么不行?是因为在我的MyCommsType里面有未知类型?

那么,我应该做以下(代码清单2)

// Data contract for my comm type 
[DataContract] 
[KnownType(typeof(Type1))] 
[KnownType(typeof(Type2))] 
[KnownType(typeof(List<Type1>))] 
[KnownType(typeof(List<Type2>))] 
public class MyCommsType { 
    [DataMember] 
    public Type1 field1; 
    [DataMember] 
    public Type2 field2; 
    [DataMember] 
    public Type1 field3; 
    [DataMember] 
    public Type2 field4; 
    [DataMember] 
    public List<Type2> field5; 
    [DataMember] 
    public List<Type1> field6; 
} 

是否正确????

但是,如果它是正确的,如何在CLR知道如何序列Type1Type2 ????? 我从未为这两种类型添加过属性? 我必须把[Serializable]如图所示(代码清单3)

// Used types 
[Serializable] 
public class Type1 { 
    ... 
} 
[Serializable] 
public class Type2 { 
    ... 
} 

如何处理这种情况?

,使其更简单(回答)考虑以下问题:

1)是否代码1彻底解决问题的序列化?

1a)如果没有,那么,如何处理这个问题?

2)在情况1)是好的,如何处理Type1Type2的序列化问题? [Serializable]应用程序是否解决?

回答

4

您的问题可以用更简单的方法解决。

无论您使用何种类型,您只需将其设置为可序列化即可。更简单的解决方案是让你的子类自己作为数据合约。

例如,如果你有

// Data contract for my comm type 
[DataContract] 
public class MyCommsType {  
[DataMember]  public Type1 field1;  
[DataMember]  public Type2 field2;  
[DataMember]  public Type1 field3;  
[DataMember]  public Type2 field4;  
[DataMember]  public List<Type2> field5;  
[DataMember]  public List<Type1> field6; 
} 

确保Type1和Type2是Datacontracts。这就是你需要做的。

[DataContract] 
public class Type1 {...} 

[DataContract] 
public class Type2 {...} 

如果您正在做任何类型的Inherence,那么您可能需要放置KnownType属性。否则,只要将子类型(Type1和Type2)保留为Datacontracts即可。

+1

+1。这是我通常所做的;只是做一切(在这种情况下,type1和type2)也是一个DataContract。 – CodingWithSpike 2011-05-31 17:16:10