WCF序列化与对象继承?
我有两个对象,一个在我们的企业级,另一个在我们的服务级。服务对象正在从企业继承。下面是一个简单的例子:WCF序列化与对象继承?,wcf,.net-3.5,serialization,Wcf,.net 3.5,Serialization,我有两个对象,一个在我们的企业级,另一个在我们的服务级。服务对象正在从企业继承。下面是一个简单的例子: [DataContract] public class EnterpriseObject{ [DataMember] int ID{get; set;} string InternalUse{get; set;} } [DataContract] public class ServiceObject: EnterpriseBaseObject{ [D
[DataContract]
public class EnterpriseObject{
[DataMember]
int ID{get; set;}
string InternalUse{get; set;}
}
[DataContract]
public class ServiceObject: EnterpriseBaseObject{
[DataMember]
string Address{get; set;}
}
是否可以在序列化中仅公开ServiceObject(具有从EnterpriseObject继承的属性)?我不希望客户端看到企业对象作为选项列出?正如您在示例中看到的,没有为InternalUser属性设置DataMember属性。这是唯一的办法吗?谢谢您通过向
EnterpriseBaseObject
添加[KnownType(typeof(ServiceObject))]
来处理继承-但是,EnterpriseBaseObject
仍然是合同的一部分,其存在将是公开的。但只会发布标记为[DataMember]
的成员
一个选项(删除继承)是使用单独的DTO进行序列化,并在DTO版本和实际版本之间进行转换,但这需要额外的工作。您能将此从is a模式更改为Has a模式吗?如果ServiceObject具有EnterpriseObject,则可以只公开所需的属性 编辑 如果我理解正确,您希望向客户端公开ServiceObject,包括其所有属性(标记为DataMember),包括从EnterpriseObject继承的属性。但您不希望客户机知道有一个名为EnterpriseObject的对象 可以通过隐藏存在企业对象的事实来实现这一点。而不是使用作为继承模式的“Is A”关系。你可以使用构图或“有”模式 现在,您已将企业对象与客户隔离。您的所有通信都是ServiceObject具有一些您不向客户机公开的属性,这些属性是由其他对象在服务器上实现的
这也类似于拥有DTO,DTO是唯一用于传输数据的对象。DTO允许您通过以客户机所需的格式提供客户机所需的内容来隐藏实现,而无需暴露内部对象。不确定您在这里的意思。你能解释一下吗?我明白你在说什么。这是一个有趣的方法!谢谢
public class ServiceObject
{
private EnterpriseObject _myEntObject;
public string MyServiceObjectProperty
{
get;
set;
}
public string MyEntObjectProperty
{
get { return _myEntObject.MyEntObjectProperty;}
}
}