Welcome

首页 / 软件开发 / .NET编程技术 / 再说WCF Data Contract KnownTypeAttribute

再说WCF Data Contract KnownTypeAttribute2010-11-27WCF 中的序列化是用DataContractSerializer,所有被[DataContract]和 [DataMemeber]标记的类和属性会被DataContractSerializer序列化。在WCF中使 用Contract模式来分辨和指定序列化/反序列化的类型,它是通过 http://xmlns/Class这样的命名空间来标识这个序列化的对象的,一旦在序列化 过程中无法找到这样的标识(比如某个字段,或者子对象)时,序列化就会失败 。KnownTypeAttribute就提供了为我们通知序列化器去寻找未知对象的映射的途 径。在Remoting中这样的问题不会存在,因为Remoting实际上是通过将一个类型 传递给双方来进行类型匹配的。

那么KnowTypeAttribute到底用在什么地 方呢?上边说了,当前类的未知类型。那什么又是当前类的未知类型呢?或许说 未知类型有些不恰当,但下边的实际应用可能会让你更清楚这到底是指什么。

1). 序列化对象是从期望返回的类型继承;

2). 无法确定当前所 使用类型的。例如Object类型,或者接口类型,你需要告诉序列化器去寻找确切 的类来进行序列化。

3). 使用泛型类型作为期望返回类型的;

4). 使用像ArrayList等以object为基础类型存储对象的;

下边 我们以第一种类型为例说明KnownTypeAttribute的用法。序列化对象一般是参与 到在服务端和客户端传递的数据。在面向对象的设计中,继承可以很好的解决很 多业务问题,并简化处理。而在下边的例子中我们可以看出KnownType到底能够 做什么。

namespace WcfServiceDemo
{
[DataContract]
public class Address
{
public Address()
{
……
}

[DataMember]
public string AddressCategory { get; set; }

[DataMember]
public string AddressTitle { get; set; }

[DataMember]
public string AddressDetail { get; set; }
}

[DataContract]
public class BusinessAddress : Address
{
……
}

[DataContract]
public class HomeAddress : Address
{
……
}
}

public class Service1 : IService1
{
public Address GetAddress(bool isHome)
{
if (isHome)
return new HomeAddress();
else
return new BusinessAddress();
}
}