sobota, 16 kwietnia 2011

70-513 - Odcinek 3 - DataContractSerializer vs XmlSerializer

W tym poście postaram się zaprezentować różnice pomiędzy dwoma typami "Serializerów" dostępnych w WCF - DataContractSerializer oraz XmlSerializer.
Tworząc serwis w WCF mamy do czynienia z protokołem SOAP (Simple Object Access Protocol). Jest on protokołem bazującym na XML-u pozwalającym komponentom oraz aplikacjom komunikować się używając standardowego protokołu http. SOAP umożliwia komunikację pomiędzy aplikacjami działającymi na różnych systemach operacyjnych, z różnymi technologiami i różnymi językami programowania. SOAP specyfikuje, że wiadomość przesyłana zapisana jest jako XML. W naszym serwisie i lub aplikacji klienckiej korzystamy z obiektów. WCF dostarcza mechanizm, który tłumaczy nasze obiekty na wiadomości XML. Proces ten nazywany jest serializacją. Proces odwrotny nazywany jest deserializacją. W WCF’ie mamy dostępne dwa typy serializacji – DataContractSerializer oraz XmlSerializer.
DataContractSerializer
Jest to domyślny typ serializer’a w WCF. Został wprowadzony w wersji 3.0 .NET Framework. Działa on na zasadzie „opt-in”. Oznacza to że wszystkie właściwości danego typu, które mają być dostępne i możliwe do przesłania z wykorzystaniem protokołu SOAP muszą być oznaczone jako takie, które mają wchodzić w skład danego kontraktu. Innymi słowy, jeśli chcemy aby np. klasa Client była możliwa do przesłania musimy udekorować ją atrybutem [DataContract]:

[DataContract]
public class Client
{
  [DataMember]
  public string FirstName {get;set;}
  [DataMember] 
  public string LastName {get;set;}
}

XmlSerializer
Ten typ jest już dostępny od wersji 1.1 .NET Framework. W przeciwieństwie do [DataContract] serializer'a, XmlSerializer działa na zasadzie "opt-out".  Oznacza to, że wszystkie właściwości danego typu domyślnie są poddawane procesowi serializacji a gdy nie chcemy aby  dana właściwość była przesyłana musimy to jednoznacznie określić:

[Serializable]
public class Client
{
   public string Firstname;
   [NonSerialized]
   public string Lastname;
}
Udekorowanie właściwości Lastname poprzez atrybut [NonSerialized] spowoduje, że właściwość ta nie będzie przesyłana.

DataContractSerializer vs XmlSerializer
A teraz meritum sprawy. Ogólnie rzecz biorąc DataContractSerializer może wydawać się lepszy - nie bez przyczyny jest domyślny w WCF. Dodatkowo jest on o około 10% szybszy niż XmlSerializer. Przy tworzeniu typowych webserwisów asmx, przeważnie programiści używali XmlSerializera. DataContractSerializer posiada większą kontrolę na typami KnownTypes i jest w stanie "zrozumieć" atrybut Serializable natomiast XmlSerializer nie rozumie atrybutu DataContract, wtedy trzeba dla typu udekorowanego tym atrybutem tak czy siak dodać atrybut Serializable

2 komentarze:

  1. DataContractSerializer umożliwia serializację obiektów klas internal dla XmlSerializer serializaowana klasa musi być public (wyjątkowo upierdliwe).

    OdpowiedzUsuń
  2. + DataContractSerializer radzi sobie z Dictionary

    OdpowiedzUsuń