有关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知道如何序列Type1
和Type2
????? 我从未为这两种类型添加过属性? 我必须把[Serializable]
如图所示(代码清单3)?
// Used types
[Serializable]
public class Type1 {
...
}
[Serializable]
public class Type2 {
...
}
如何处理这种情况?
,使其更简单(回答)考虑以下问题:
1)是否代码1彻底解决问题的序列化?
1a)如果没有,那么,如何处理这个问题?
2)在情况1)是好的,如何处理Type1
和Type2
的序列化问题? [Serializable]
应用程序是否解决?
+1。这是我通常所做的;只是做一切(在这种情况下,type1和type2)也是一个DataContract。 – CodingWithSpike 2011-05-31 17:16:10