2009-12-28 23 views

Odpowiedz

8

Tak, możesz podać własną implementację serializera. Domyślnie WCF użyje DataContractSerializer. Aby udostępnić swój własny serializator, musisz napisać własną wersję IOperationBehavior, która wyszukuje i usuwa aktualnie obowiązującą kolekcję DataContractSerializerOperationBehavior z kolekcji OperationDescription::Behaviors, a następnie stosuje niestandardową instancję obiektu DataContractSerializerOperationBehavior. DataContractSerializerOperationBehavior jest następnie odpowiedzialny za skonstruowanie implementacji XmlObjectSerializer w swoich metodach fabrycznych. W przypadku niektórych przykładów kodu, jak to zrobić, check out this article by Dan Rigsby.

Stamtąd chodzi wyłącznie o wdrożenie własnego niestandardowego XmlObjectSerializer, który pozwoli na przekształcenie kodu XML w dowolną reprezentację.

+0

Cześć Drew, Ale to mój serializer musi pochodzić z klasy bazowej lub implementować niektóre interfejsy. Jeśli odpowiedź brzmi "tak", co to jest? Czy serializator musi być rodzajem xmlserializera? Napisałem serializer, który serializuje typy jako bajty. – mkus

+0

Musisz odziedziczyć po XmlObjectSerializer i zapewnić implementację własną dla różnych metod. –

+0

To jest starsze pytanie, ale myślę, że powinienem dodać, że ten artykuł z msdn ostrzega przed modyfikowaniem OperationDescription z metody IOperationBehavior http://msdn.microsoft.com/en-us/library/system.servicemodel.description.ioperationbehavior. aspx. – insipid

2

Normalnie umieścić atrybut [DatacontractSerializer] lub [XmlSerializer] powyżej umowy o świadczenie usług im całkiem pewien, że można tworzyć własne więc dlaczego je stosować jako atrybuty, teraz jeśli tylko reflector ruszy tak, że mogę sprawdzić XmlSerializer i dowiedzieć się, co sprawia, że ​​się kleszczy.

msdn twierdzą, że ćwiczenia, które chcą być szeregowane przez XmlSerializer, musi być ozdobione [XmlAttribute] lub [XmlElement] atrybutów (ponieważ dałoby to więcej kształt do pliku xml ze zrozumieniem), ale to nie działa, jeśli zajęcia są ozdobione [DataMember], który jest zgodny z DataContractSerializer, dlatego powinieneś być w stanie stworzyć własny serializator, który będzie serializować wszystko za pomocą znacznika [DataMember], tak jak XmlSerializer

3

Zespół WCF zrobił to po wprowadzeniu DataContractJsonSerializer.

Istnieje dalece więcej punktów styczności niż te wymienione w pozostałych dwóch odpowiedziach - na przykład może zajść potrzeba wprowadzenia i zmiany zachowań operacji i formaterów operacji, dodania nowego kodera i dodania zupełnie nowego także zachowanie usług i klientów. To zależy od tego, jaki jest nowy format serializacji i co próbujesz zrobić.

Jednak jeśli Twoim celem jest dodanie tylko nowego serializera do samodzielnej serializacji, jest to prostsze.

Co mogę polecić jest - spójrz na wszystkie inne zastosowania DataContractJsonSerializer (za pośrednictwem reflektora) w pliku System.Runtime.Serialization.dll, System.ServiceModel.Web.dll i System.Runtime.ServiceModel.dll.

Jeśli interesuje Cię tylko samodzielny typ serializacji, po prostu spójrz na DataContractJsonSerializer i powiązane klasy w przestrzeni nazw Serialization. Powinna być dość intuicyjna, aby uchwycić różne subtelności implementacji niestandardowej serializacji. Zapytaj, jeśli masz konkretne pytania, ale naprawdę wierzę, że jest to najszybszy i najbardziej elegancki sposób, aby nauczyć się tego konkretnego rozwiązania ...

Powiązane problemy