NetDataContractAttribute与DataContractAttribute?

时间:2009-09-08 09:02:17

标签: c# wcf

在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; }
    }
}

4 个答案:

答案 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世界中并且你真的需要数据契约类层次结构的服务。

我希望它有所帮助。