Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization 如何使用WCF将派生类型序列化为其基类型_Serialization_Wcf_Datacontractserializer_Datacontract - Fatal编程技术网

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

Serialization 如何使用WCF将派生类型序列化为其基类型,serialization,wcf,datacontractserializer,datacontract,Serialization,Wcf,Datacontractserializer,Datacontract,我有一个公共库,其中包含一些对象。然后我有一个服务项目,它引用公共库并从公共库中的对象创建一些派生类型 我希望我的服务将派生类型序列化为它们在公共库中定义的基类型 我无法对公共库中的对象使用KnownTypes,因为我不希望公共库引用服务程序集 那么,如何让wcf将派生类型序列化为它们的基类型呢 我希望我能做点像 [DataContract(SerializeAsType=typeof(BaseType))] 公共类DerivedType:BaseType { } 这样做可能吗?您使用的是.NE

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

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

我无法对公共库中的对象使用KnownTypes,因为我不希望公共库引用服务程序集

那么,如何让wcf将派生类型序列化为它们的基类型呢

我希望我能做点像

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


这样做可能吗?

您使用的是.NET 4.0吗?如果您:

这也是EntityFramework4.0为代理类型的DataContractResolver所做的基本工作

以下是一个例子:

(请参阅链接中的反序列化ASBaseResolver)

编辑: 如果您没有使用.NET 4.0,我认为您的下一个最佳选择是DataContractProxy:。 …因此您可以手动控制序列化,但这可能会变得混乱

两者都传递到DataContractSerializer的构造函数中,并且可以通过DataContractSerializeRopeAction:为WCF配置。

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


希望有帮助。

我使用的是3.5,所以我不得不使用代理选项。。。而且效果很好!谢谢你,马克。你就这么做了吗?我们能举一个更完整的例子吗?是的,这就是我们需要做的。只需将契约重命名为基类的名称。+1对我来说,这是迄今为止最简单的解决方案。这是一个单一的班轮工作。DataContractResolver方法很长,涉及类和插入解析器服务器主机等。其唯一的补救功能是,您可以逐个方法控制契约行为-其中此名称=解决方案适用于此对象传输的所有实例(在我的情况下,这是可以的)。只是要指出,如果您有多个已知的基类派生类型,则这不起作用。在本例中,还必须为每个派生类型声明一个单独的命名空间。这会对尝试构建通用XPath映射到公共项造成严重破坏。