让我们有一个非常简单的例子:指示WCF反序列化类型T1为T2
[ServiceContract]
public interface IMyService
{
[OperationContract]
T1 GetData();
}
[DataContract]
[KnownType(typeof(T2))]
public class T1
{
[DataMember]
int Value { get; set; }
}
[DataContract]
public class T2: T1
{ }
我需要能够发送T1,而是接受它作为T2在客户端(简单的原因:企业的快速转换对象为客户端只读类型;将服务器池对象转换为客户端非池化类型,如果需要,我可以进一步阐述)。
为了使它有点复杂 - 该数据类型的树来发送具有多种类型,例如:
[OperationContract]
TBase GetData();
[DataContract]
[KnownType(typeof(T1))]
[KnownType(typeof(T2))]
[KnownType(typeof(T3))]
[KnownType(typeof(Tn))]
public class TBase
{
[DataMember]
int Value { get; set; }
}
[DataContract]
public class T1: TBase { }
[DataContract]
public class T2: TBase { }
[DataContract]
public class T3: TBase { }
[DataContract]
public class Tn: TBase { }
,我需要的就是接收所有类型,与T1的例外,那必须是作为T2收到。
我测试了序列化/反序列化部分很容易与DataContractSerializer一起使用,但我找不到如何指示WCF使用不同的DataContractSerializer来反序列化T1。
EDIT1: 看起来这应该是可行的byderiving定制DataContractResolver和注射这两种(客户端 - 服务器)上的操作合同双方WCF。我得到了这个几乎工作 - 序列化 - 反序列化本身按预期工作,WCF仍然失败。我会尽力回答后,一旦我发现