具有共享程序集的DataContractAttribute

时间:2010-05-29 06:17:52

标签: c# wcf web-services

使用共享程序集时,是否有必要使用[DataContract][DataMember]装饰自定义对象(而不是自动代理生成)?

我问的原因是我遇到了以下情况:

假设我的服务中实现了以下对象:

public class baseClass
{
  Guid _guid;

  public baseClass()
  {
      _guid = Guid.NewGuid()
  }

  public Guid ReturnGuid { get {return _guid;}}
}

public class newClass : baseClass
{
    int _someValue;

    public newClass {}

    public int SomeValue
    {
       get {return _someValue;}
       set {_someValue = value;}
    }
}

[ServiceContract]
public IService
{
   [OperationContract]
   newClass SomeOperation();
}

在我的客户端(使用共享程序集)中,当调用SomeOperation时,我可以愉快地接收并使用序列化的newClass - 即使我没有将它标记为DataContract。

但是,只要我使用DataContract标记它并使用DataMember,它就会抱怨在基类的ReturnGuid上没有实现set。

当我不使用DataContract和DataMember进行装饰时,有人可以解释为什么它能正常工作。

非常感谢。

2 个答案:

答案 0 :(得分:0)

当.NET 3.0首次发布时,为了使用DataContractSerializer序列化对象,无论您使用的是共享程序集还是生成的代理,所有类和属性都必须使用这些属性进行标记。从.NET 3.5 SP1开始,no longer need to put those attributes将序列化所有公共属性。在您的情况下,问题是默认情况下ReturnGuid没有序列化,因为它没有setter,如果你放置属性,你强制执行没有setter的属性的序列化,并且它会抱怨。

尽管您可以省略这些属性,但我建议您在所有实体上使用它们。对于ReturnGuid属性,如果您希望通过网络传输,请添加一个setter。

public Guid ReturnGuid 
{ 
    get { return _guid; } 
    set { _guid = value; }
}

答案 1 :(得分:0)

Microsoft在.NET 3.5 Service Pack 1中引入了一项更改,因为不再需要DataContract / DataMember属性。

因此,如果您不想,则不需要拥有这些属性。如果省略这些属性,DataContractSerializer将像XmlSerializer一样序列化对象类:

  • 序列化所有公共读/写属性(同时具有getset方法的属性)
  • 按照它们在类定义中出现的顺序对它们进行序列化

所以不 - 你不必再拥有这些属性了。但是如果你把它们排除在外,你也失去了使用它们的好处:你不能定义一个要求的成员,你不能定义在序列化的XML等中订购属性的顺序。