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
DataContractSerializer umożliwia serializację obiektów klas internal dla XmlSerializer serializaowana klasa musi być public (wyjątkowo upierdliwe).
OdpowiedzUsuń+ DataContractSerializer radzi sobie z Dictionary
OdpowiedzUsuń