通过WCF传递继承的梦魇

时间:2014-11-26 20:27:07

标签: wcf icloneable

我们在WCF服务中有一个类,如下所示

[DataContract]
public class SampleClass:ICloneable
{ public object Clone()  { return MemberwiseClone(); } .... }

在添加了服务引用的客户端,我在对象浏览器中打开引用,但是 它没有将ICloneable作为继承的接口传递,例如" IExtensibleDataObject"

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="SampleClass",
Namespace="http://schemas.datacontract.org/2004/07/TestService")]
[System.SerializableAttribute()]
public partial class SampleClass : object, System.Runtime.Serialization.IExtensibleDataObject,
System.ComponentModel.INotifyPropertyChanged { .... }

有谁知道我怎么能通过它?

1 个答案:

答案 0 :(得分:2)

它不能并且不应该通过。对象是否实现ICloneable不是服务合同的一部分。如果客户端正在克隆对象,服务器也不关心它,也不能为克隆操作提供实现。

如果您希望对象可以克隆,那么您必须在客户端方面提供实现 - 请注意该类是partial,因此您可以简单地创建一个新文件:

public partial class SampleClass : ICloneable {
    public object Clone() { 
        return MemberwiseClone();
    }
}

当然,如果你必须为所有生成的类型执行此操作,那可能会很痛苦。如果您正在编写服务(或者可以访问源代码)并且已经包含正确的Clone实现,则可以通过将它们放在单独的程序集中来在客户端和服务器中使用相同的类。这并非完全无足轻重,因为您需要在Visual Studio中解决一些固执问题;见" WCF and Shared Reference Library Between Client & Service"了解更多详情。

请注意the MSDN says

  

ICloneable界面只需要您的实施   Clone方法返回当前对象实例的副本。确实如此   不指定克隆操作是否执行深层复制,a   浅拷贝,或介于两者之间的东西。它也不需要所有人   要复制到新实例的原始实例的属性值   实例。例如,NumberFormatInfo.Clone方法执行a   除NumberFormatInfo.IsReadOnly以外的所有属性的浅层副本   属性;它总是在克隆中将此属性值设置为false   宾语。因为Clone的来电者不能依赖该方法   执行可预测的克隆操作,我们建议   ICloneable未在公共API中实现。

如果您需要一个可克隆的对象,您仍然可以实现自己的Clone方法(如果合适,则使用MemberwiseClone),但可能没有充分的理由使用{{1} }。