Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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
C# 序列化接口子类的DataContract_C#_Wcf_Datacontract - Fatal编程技术网

C# 序列化接口子类的DataContract

C# 序列化接口子类的DataContract,c#,wcf,datacontract,C#,Wcf,Datacontract,我的情况是这样的: 有一个服务方法应该接受某个接口的集合。 客户端有几个实现该接口的类。出于争论的考虑,可能只有一个,关键是它们只添加私有成员。 我不想让服务知道客户端中的实现类型。 那么,我有没有办法在服务中创建该接口的另一个子类,作为DataContract,以便正确地序列化/反序列化客户端中现有的类?或者我需要一个不同的解决方案 您可以在客户端创建一个基类,实现该接口的所有子类都将从中继承,并为每个子类添加一个基类 [KnownType(typeof(Subclass1))] [Known

我的情况是这样的: 有一个服务方法应该接受某个接口的集合。 客户端有几个实现该接口的类。出于争论的考虑,可能只有一个,关键是它们只添加私有成员。 我不想让服务知道客户端中的实现类型。
那么,我有没有办法在服务中创建该接口的另一个子类,作为DataContract,以便正确地序列化/反序列化客户端中现有的类?或者我需要一个不同的解决方案

您可以在客户端创建一个基类,实现该接口的所有子类都将从中继承,并为每个子类添加一个基类

[KnownType(typeof(Subclass1))]
[KnownType(typeof(Subclass2))]
[DataContract]
public class BaseClass : ISomeInterface
{

}

这是我的数据合同吗?我应该在我的服务器上做什么?@Nadavrbn是的,将其作为您的数据合同。您的服务器现在必须知道基类,以便正确地序列化/反序列化它。查看帖子以更好地理解概念。我看到,我要找的是服务器不知道这些类型,因为它会产生强耦合。@Nadavrbn服务不可能序列化/反序列化它不知道的内容。关于强耦合-正是出于这个目的,
KnownTypes
功能才适用。它允许服务器在编译时只知道基类,而实现接口的类只在运行时知道,从而减少耦合。如果您想进一步减少耦合,请将它们移动到完全不同的程序集,即服务器或客户端。看一看详细的示例,我所做的是创建一个共享类,在我的客户端上,通过复制属性将未知类型解析为共享类型。非常感谢你!顺便说一句,我看到你在MAAV。我就在隔壁