我有一个包含一些对象的公共库 . 然后我有一个引用公共库的服务项目,并从公共库中的对象创建一些派生类型 .
我希望我的服务将派生类型序列化为公共库中定义的基类型 .
我不能在公共库中的对象上使用KnownTypes,因为我不希望公共库引用服务程序集 .
那么如何将wcf序列化派生类型作为其基类型?
我希望我能做点像......
[DataContract(SerializeAsType = typeof(BaseType))] public class DerivedType:BaseType {}
这样的事情可能吗?
2 回答
你使用的是.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配置为WCF:http://msdn.microsoft.com/en-us/library/system.servicemodel.description.datacontractserializeroperationbehavior.aspx .
我们刚刚通过设置继承类[DataContract(Name =“BaseClass”)]来“解决”这个问题 . 即使继承的类是内部的并在另一个项目中定义,它也可以工作 .
希望能帮助到你 .