Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/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
.net 公开WCF服务可能不直接使用的对象(DataContract)?_.net_Wcf_.net 3.5_Datacontractserializer - Fatal编程技术网

.net 公开WCF服务可能不直接使用的对象(DataContract)?

.net 公开WCF服务可能不直接使用的对象(DataContract)?,.net,wcf,.net-3.5,datacontractserializer,.net,Wcf,.net 3.5,Datacontractserializer,我有一些使用继承的对象类。似乎我只能访问服务直接使用的对象。让我向您展示我正在努力实现的目标: [DataContract] public class Object1 { [DataMember] int Id {get; set;} } [DataContract] public class object2: Object1 { [DataMember] string Name {get; set;} } [DataContract] public class ob

我有一些使用继承的对象类。似乎我只能访问服务直接使用的对象。让我向您展示我正在努力实现的目标:

[DataContract]
public class Object1
{
   [DataMember]
   int Id {get; set;}
}

[DataContract]
public class object2: Object1
{
   [DataMember]
   string Name {get; set;}
}

[DataContract]
public class object3 
{
    [DataMember]
    int SomeNumber {get; set;}
}
服务:

public int GetId(object2 obj)
{
    return GetTheId(object2.Name);
}
现在,由于我在服务中使用object2,object1也会被序列化。然而,出于某种原因,我可能想公开object3。它可能是我必须传递的派生类,以便稍后为另一个进程确定其类型。我没有看到这个对象被序列化。我假设,无论何时设置DataContract/DataMember,这些对象都将被序列化。不公开未开始使用的内容是有意义的,因为我可以看到公开您可能不需要的项目存在问题。公开服务不直接使用的对象的最佳方式是什么?谢谢


丹尼尔我相信你回答了你自己的问题。如果服务未使用成员,则不应公开它们。最好公开服务所需的最小数据集,因为这通常会提高服务的可维护性。

您应该为类修饰object2特有的名称:

假设您的意思是object3是object2的子类:

public class object3: object2
{
}

确实如此,但是暴露一个没有直接使用的对象的最佳方式是什么?不要这样做是最好的方式。从服务器上客户端应该知道的唯一一件事是服务操作使用的对象。这忽略了一个事实,即在这些情况下继承是一种现实。这对于用代码设计的契约和用XML模式设计的契约来说都是现实——你必须定义继承的类型,这样客户端才能定义该类型。我完全忘记了这个属性!!!谢谢这就是我在这种情况下所需要的。谢谢您还可以使用[ServiceKnownType]装饰您的服务合同:
public class object3: object2
{
}