2009-12-19 79 views
4

我有一些简单的POCO对象:C# - 使用XMLSerializer和DataContractSerializer支持序列化的属性?

public class ProductCategoryDTO 
{ 
     public string Name { get; set; } 
     public DateTime ModifiedDate { get; set; } 
} 

由于有时场顺序是很重要的(例如,如果发送到InfoPath表单),我需要保持元件顺序串行化时。

现在我很困惑,我应该为类和每个字段使用哪些属性。我知道:

  • DataContractSerializer的使用[DataContract]和[数据成员(订单= N)]
  • XMLSerializer的用途[序列化]和[XmlElementAttribute(订单= N)]。

然后,如果我想同时支持XMLSerializer和DataContractSerializer,那么可以使用哪些属性,因此可以同时用于WCF或ASP。网页服务?

回答

3

我看不出有什么理由不能把这两个属性放在类和成员属性上,如果你真的必须的话。不好看,但如果它适合你,那就好了!

[DataContract(Namespace="....")] 
[XmlType] 
public class ProductCategoryDTO 
{ 
     [DataMember(Order=1)] 
     [XmlElementAttribute(Order=1)] 
     public string Name { get; set; } 

     [DataMember(Order=2)] 
     [XmlElementAttribute(Order=2)] 
     public DateTime ModifiedDate { get; set; } 
} 
+0

是的,我也有这个想法。我只是希望DataContract也可以使用[XmlElementAttribute(Order = n)] – JustAMartin 2009-12-19 17:33:30

+0

@Martin:没有那两个序列化器是完全独立的,完全不同,并且不使用彼此的属性。 – 2009-12-19 17:34:24

+0

你可能是指'class'上的XmlType,顺便说一句。 – 2009-12-19 18:32:28

1

XML元素的顺序应该由WSDL规定,您不必担心。从.NET 3.5 SP1开始,不再需要使用DataContractAttributeDataMemberAttribute。序列化器将自动包含所有公共属性。至于而言,SerializableAttribute不起作用。该属性用于BinaryFormatter的二进制序列化。因此,为了继续,您可以将该类作为POCO离开,将其暴露在WCF或ASP.NET Web服务中,并让客户端根据WSDL使用它。

+0

我指的是这个: http://stackoverflow.com/questions/612160/any-way-to-make-xmlserializer-output-xml-in-a-defined-order 也有一个话题关于Adobe/flex开发人员 - 他们抱怨说,对于.NET Web方法,每次重建类库或Web服务时,字段顺序都会发生变化。 另外,我对Infopath表单有不好的体验 - 他们期望以某种顺序接收元素。为了避免实现我们自己的解决方案,最简单的方法是将Order属性或我们的Infopath表单开发人员在每个构建中疯狂地调整xsl:D – JustAMartin 2009-12-19 17:31:59

6

严格说,你不需要用于任何;-p它曾经是DataContractSerializer会要求[DataContract]/[DataMember](他们绝对应该使用)的任何属性,但你可以没有使用它(但它然后以非常可疑的方式类似于BinaryFormatter)。同样,XmlSerializer不需要需要任何东西,除非你想控制的东西。然而,有一些差异你应该注意:

  • XmlSerializer要求(和使用)一个公共无参数构造函数; DataContractSerializer不使用构造函数(完全)。所以要小心,不要(对于WCF)依靠ctor中的代码 - 如果您有必要的init代码,请为WCF使用序列化回调。
  • XmlSerializer要求公共领域(yeuch)或公共财产getset(即使列表); DataContractSerializer将愉快地对私人成员,与(例如)公众get和私人set和集合没有'集(只要您的类型初始化它)的属性。
  • XmlSerializer要求公共类型; IIRC DataContractSerializer不太挑剔

所以,是的;你可以同时支持两个序列化器,并且你可以并行地添加的任意数量的属性,但是如果你想要完全兼容,请注意上面的内容。

另一种选择是只使用XmlSerializer;您可以使用[XmlSerialzerFormat]将WCF配置为使用XmlSerializer。这两个选项都支持继承,通过[XmlInclude][KnownType]

最后,请注意,如果您实施IXmlSerializable,则优先于两者之一,但很难正确。除非必须,否则不要这样做。

相关问题