WCF中有关DataContract的复杂情况。

| WCF中有数千个关于“ 0”的问题,对于涉及继承的情况尤其要注意。 但是,我没有找到关于特定情况的示例,这些示例在我将要在此处提供的示例中进行了总结。 考虑以下适用于WCF服务通信中使用的类型的“ 0”(代码清单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);
}
我的个人类型“ 4”是参与交流的类型。但是,当然,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如何知道如何序列化
Type1
Type2
????? 我从未向这两种类型添加属性???? 我是否必须按如下所示放置
[Serializable]
(代码清单3)?
// Used types
[Serializable]
public class Type1 {
   ...
}
[Serializable]
public class Type2 {
   ...
}
如何处理这种情况? 为了使其更简单(用于回答),请考虑以下问题: 1)代码清单1是否完全解决了序列化问题? 1a)如果没有,那么如何处理该问题? 2)在情况1)可以的情况下,如何处理
Type1
Type2
的序列化问题?
[Serializable]
申请解决吗?     
已邀请:
        您的问题可能以更简单的方式解决。 无论您使用哪种类型,您只需要做的就是使其可序列化即可。较简单的解决方案是使子类成为Data Contract本身。 例如,如果您有
// 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是数据合同。这就是您需要做的。
[DataContract]
public class Type1 {...}

[DataContract]
public class Type2 {...}
如果要执行任何类型的Inherence,则可能需要放置KnownType属性。否则,只需像Datacontracts那样保留子类型(Type1和Type2)即可。     

要回复问题请先登录注册