代码之家  ›  专栏  ›  技术社区  ›  Jaswant Agarwal

NetDataContractAttribute与DataContractAttribute?

  •  1
  • Jaswant Agarwal  · 技术社区  · 15 年前

    在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 回复  |  直到 13 年前
        1
  •  2
  •   Marc Gravell    15 年前

    为了实现最广泛的可移植性,只需使用 [DataContract] [DataMember] . 一个小注意事项:它不会使用您的构造器(这通常会让人吃惊),也不能保证生成相同的XML(特别是如果您使用属性的话)。如果你 希望 可控制的XML(而不是WCF的首选格式,后者提供的控制较少),那么有办法说服WCF使用 XmlSerializer 而不是 DataContractSerializer -通过将服务合同(接口)标记为 [XmlSerializerFormat] .

        2
  •  2
  •   John Saunders    15 年前

    在大多数情况下,应该使用数据协定序列化程序。你应该移除 Serializable 来自类的属性(XML序列化程序在任何情况下都不关注它)。此外,还应该从类中删除各种XML属性。如果需要控制元素名,那么应该使用 [DataMember] 属性。

        3
  •  1
  •   Jarrod268    15 年前

    它实际上取决于您需要哪种类型的互操作性。示例类将每个属性都作为字符串,因此您不需要处理任何特定于.NET的内容。无论是序列化程序(DATACONTRORT还是NETDATACONTROUNT)都可以工作,但是,NETDATACONTractSerialStaseAtter允许通过在另一方可能不存在的网络上传输.NET特定项,因为客户端是Java。

    如果您知道永远不会向.NET使用者公开您的服务,那么NetDataContract就可以用于所有目的。如果您知道需要interop,那么datacontract就是您的最佳选择。

        4
  •  0
  •   jdearana    13 年前

    主要的区别在于,NetDataContractSerialization序列化数据协定类的基本类型的元数据信息,因此您可以通过线类层次结构进行序列化。在下面的代码中,您将能够调用get staff并获得类型化的staff元素列表:

    [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世界中始终“活动”的服务,并且您确实需要数据契约类层次结构。

    希望能有所帮助。