问题描述
|
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)即可。