【发布时间】:2011-09-05 14:34:25
【问题描述】:
WCF 中有数以千计的关于DataContract(s) 的问题,特别注意涉及继承的情况。
但是,我没有找到任何关于特定情况的示例,所有这些示例都汇总在我将在此处提供的示例中。
考虑将以下 DataContract 应用于 WCF 服务通信中使用的类型(代码清单 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) ok的情况下,Type1和Type2的序列化问题如何处理? [Serializable]应用解决了吗?
【问题讨论】:
标签: .net wcf serialization datacontract