在wcf NetDataContractAttribute或DataContractAttribute中应该使用哪一个?
数据类如下
namespace ABC
{
[Serializable]
public class DeviceConf
{
public DeviceConf() {}
[XmlElement(ElementName = "ProtocolName")]
public string ProtocolName{ get; set; }
[XmlElement(ElementName = "Type")]
public string TypeName { get; set; }
}
}
答案 0 :(得分:2)
要获得最广泛的可移植性,只需使用[DataContract]
和[DataMember]
即可。一个小注意事项:它不会使用你的构造函数(这通常会令人惊讶),并且不能保证生成相同的xml(特别是如果你使用属性)。如果你想要可控制的xml(而不是WCF的首选格式,它提供较少的控制),那么有办法说服WCF使用XmlSerializer
而不是DataContractSerializer
- 通过标记服务-contract(interface)与[XmlSerializerFormat]
。
答案 1 :(得分:2)
您应该将数据合同序列化程序用于大多数用途。您应该从类中删除Serializable
属性(XML Serializer在任何情况下都不会注意它)。此外,您应该从类中删除各种XML属性。如果您需要控制元素名称,那么您应该使用[DataMember]
属性。
答案 2 :(得分:1)
这实际上取决于您需要什么类型的互操作性。示例类将每个属性都作为字符串,因此您不会处理特定于.NET的任何内容。序列化程序(DataContract或NetDataContract)都可以工作,但NetDataContractSerializer允许通过线路传输特定于.NET的项目,因为客户端是java,因此可能不存在于另一端。
如果您知道您永远不会将您的服务公开给.NET使用者,那么NetDataContract可以用于所有目的。如果您知道您需要互操作,DataContract是您最好的选择。
答案 3 :(得分:0)
主要区别在于NetDataContractSerialization序列化数据协定类的基本类型的元数据信息,因此您可以序列化线类层次结构。在下面的代码中,您将能够调用GetStaff并获取一个类型的人员元素列表:
[ServiceContract]
public interface IPersonService
{
[OperationContract]
[NetDataContract]
List<Staff> GetStaff();
[OperationContract]
void RegisterClinician(Clinician clinician);
[OperationContract]
void Register(Secretary secretary);
}
[DataContract]
public class Staff
{
public string Name { get; set; }
}
[DataContract]
public class Clinician:Staff
{
}
[DataContract]
public class Secretary:Staff
{
}
我同意你应该更好地避免NetDataContractSerializer由于互操作性的原因,除非它是一个总是“活在”.NET世界中并且你真的需要数据契约类层次结构的服务。
我希望它有所帮助。