使用共享程序集时,是否有必要使用[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进行装饰时,有人可以解释为什么它能正常工作。
非常感谢。
答案 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一样序列化对象类:
get
和set
方法的属性)所以不 - 你不必再拥有这些属性了。但是如果你把它们排除在外,你也失去了使用它们的好处:你不能定义一个要求的成员,你不能定义在序列化的XML等中订购属性的顺序。