如何使用WCF将派生类型序列化为其基类型

时间:2010-11-10 03:16:21

标签: serialization wcf datacontractserializer datacontract

我有一个包含一些对象的公共库。然后我有一个引用公共库的服务项目,并从公共库中的对象创建一些派生类型。

我希望我的服务将派生类型序列化为公共库中定义的基类型。

我不能在公共库中的对象上使用KnownTypes,因为我不希望公共库引用服务程序集。

那么如何将wcf序列化派生类型作为其基类型?

我希望我能做点像......

[DataContract(SerializeAsType = typeof(BaseType))] 公共类DerivedType:BaseType { }

这样的事情可能吗?

2 个答案:

答案 0 :(得分:7)

我们通过设置继承的类[DataContract(Name =“BaseClass”)]来“解决”这个问题。即使继承的类是内部的并且在另一个项目中定义,它也可以工作。

希望它有所帮助。

答案 1 :(得分:3)

您使用的是.NET 4.0吗?如果您符合以下条件,可以使用DataContractResolver:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractresolver.aspx

这也基本上是Entity Framework 4.0为其代理类型的DataContractResolver所做的。

这是一个例子: http://blogs.msdn.com/b/youssefm/archive/2009/06/05/introducing-a-new-datacontractserializer-feature-the-datacontractresolver.aspx

(请参阅链接中的DeserializeAsBaseResolver。)

编辑: 如果您不使用.NET 4.0,我认为您的下一个最佳选择是DataContractSurrogate:http://msdn.microsoft.com/en-us/library/system.runtime.serialization.idatacontractsurrogate.aspx。 ...所以你可以手动控制序列化,但这可能会变得混乱。

两者都传递到DataContractSerializer的构造函数中,可以通过DataContractSerializerOperationBehavior http://msdn.microsoft.com/en-us/library/system.servicemodel.description.datacontractserializeroperationbehavior.aspx为WCF配置。