Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NetDataContractAttribute与DataContractAttribute?_C#_Wcf - Fatal编程技术网

C# NetDataContractAttribute与DataContractAttribute?

C# NetDataContractAttribute与DataContractAttribute?,c#,wcf,C#,Wcf,在wcf NetDataContractAttribute或DataContractAttribute中应该使用哪一个 数据类如下所示 namespace ABC { [Serializable] public class DeviceConf { public DeviceConf() {} [XmlElement(ElementName = "ProtocolName")] public string Protocol

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

要获得最广泛的可移植性,只需使用
[DataContract]
[DataMember]
。一个小提示:它不会使用您的构造函数(这通常会让人们感到惊讶),而且它也不能保证生成相同的xml(特别是在使用属性的情况下)。如果您想要可控的xml(而不是WCF的首选格式,它提供的控制较少),那么有一些方法可以说服WCF使用
XmlSerializer
而不是
DataContractSerializer
——通过使用
[XmlSerializerFormat]
标记服务合同(接口)以获得最广泛的可移植性,只需使用
[DataContract]
[DataMember]
。一个小提示:它不会使用您的构造函数(这通常会让人吃惊),而且它也不能保证生成完全相同的xml(特别是在使用属性的情况下)。如果您想要可控的xml(而不是WCF的首选格式,后者提供的控制较少)还有一些方法可以说服WCF使用
XmlSerializer
而不是
DataContractSerializer
——方法是使用
[XmlSerializerFormat]标记服务合同(接口)

这实际上取决于您需要什么类型的互操作性。示例类的每个属性都是字符串,因此您不需要处理任何特定于.NET的内容。序列化程序(DataContract或NetDataContract)但是,NetDataContractSerializer允许通过线路传输.NET特定的项,这些项在另一端可能不存在,因为客户端是java


如果您知道永远不会向.NET使用者公开您的服务,那么NetDataContract在任何情况下都可以。如果您知道需要互操作,那么DataContract是您的最佳选择。

这实际上取决于您需要什么类型的互操作性。示例类的每个属性都是字符串,因此您不需要处理h任何特定于.NET的内容。序列化程序(DataContract或NetDataContract)都可以工作,但是,NetDataContractSerializer允许通过线路传输.NET特定的项,因为客户端是java,所以在另一端可能不存在


如果您知道永远不会向.NET使用者公开您的服务,那么NetDataContract在所有方面都可以。如果您知道需要互操作,那么DataContract是您的最佳选择。

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

大多数情况下都应该使用数据协定序列化程序。应该从类中删除可序列化的
属性(XML序列化程序在任何情况下都不会注意它)。此外,您应该从类中删除各种XML属性。如果您需要控制元素名称,则应该使用
[DataMember]
属性。

主要区别在于NetDataContractSerialization序列化了数据协定类基本类型的元数据信息,因此您可以通过wire类层次结构进行序列化。在以下代码中,您可以调用GetStaff并获取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
{
}
[服务合同]
公共接口IPersonService
{
[经营合同]
[NetDataContract]
列出GetStaff();
[经营合同]
无效登记医师(临床医生);
[经营合同]
无效登记册(秘书);
}
[数据合同]
公营班主任
{
公共字符串名称{get;set;}
}
[数据合同]
公立临床医生:教职员
{
}
[数据合同]
公开课秘书:职员
{
}
我还同意,由于互操作性的原因,您最好避免使用NetDataContractSerializer,除非它是一种在.NET世界中始终“存在”的服务,并且您确实需要数据契约类层次结构


我希望这会有所帮助。

主要区别在于NetDataContractSerialization序列化了数据协定类的基本类型的元数据信息,因此您可以通过wire类层次结构进行序列化。在以下代码中,您可以调用GetStaff并获取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
{
}
[服务合同]
公共接口IPersonService
{
[经营合同]
[NetDataContract]
列出GetStaff();
[经营合同]
无效登记医师(临床医生);
[经营合同]
无效登记册(秘书);
}
[数据合同]
公营班主任
{
公共字符串名称{get;set;}
}
[数据合同]
公立临床医生:教职员
{
}
[数据合同]
公开课秘书:职员
{
}
我还同意,由于互操作性的原因,您最好避免使用NetDataContractSerializer,除非它是一种在.NET世界中始终“存在”的服务,并且您确实需要数据契约类层次结构


我希望它能有所帮助。

-1:这个答案很容易误导。
DataContractSerializer
可以很好地处理字符串以外的类型,而您的答案表明它不能。将注释改写为不那么模棱两可。-1:这个答案很容易误导。
DataContractSerializer
可以很好地处理字符串以外的类型,并且您的答案是建议它没有。将注释改写为不那么模棱两可。是的,马克。但我仍然对DataContract和NetDataContract的用法感到困惑。一个区别是关于构造函数,有没有办法找到哪一个更好?在什么方面更好?这是主观的。如果它起作用,我会说DataContract更好,因为它更容易实现可移植性,我关心可移植性