2009-06-03 15 views
9

Mam potrzebę przekazania niestandardowego obiektu do zdalnej usługi WWW. Czytałem, że może być konieczne wdrożenie ISerializable, ale zrobiłem to i napotykam trudności. Jaki jest właściwy sposób w języku C#, aby przekazać niestandardowy obiekt do metody usługi sieci Web?C# .NET Web Services - przekazywanie niestandardowych obiektów do usługi WWW

+0

To może być lepiej, jeśli można być specyficzny temat trudności napotykają. Co tak naprawdę próbujesz zrobić? Może pomogą konkretne przykłady. Co masz na myśli przez "przekazanie niestandardowego obiektu"? może to oznaczać wiele rzeczy. Pomogą w tym niektóre informacje. – Cheeso

Odpowiedz

6

obiekty, które świadczą jako argumenty jako część żądania usług musi być oznaczona [Serializable] oraz w oparciu o niektóre odpowiedzi delegowanych przed kopaniem musisz się upewnić, że twój obiekt niestandardowy nie zawiera żadnych parametrów w konstruktorze.

Należy również pamiętać, że żadna logika wewnątrz klasy nie zostanie utworzona w klasie proxy, która zostanie utworzona po stronie klienta. Wszystko, co zobaczysz po stronie klienta, to domyślny konstruktor i właściwości. Jeśli więc dodasz metody do niestandardowych obiektów, pamiętaj, że klient ich nie zobaczy lub nie będzie mógł ich użyć.

To samo dotyczy dowolnej logiki, którą można umieścić w dowolnej z właściwości.

Przykład

[Serializable] 
public class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
+4

Jim, przepraszam, ale [Serializable] nie ma nic wspólnego z usługami sieciowymi. –

+0

@John: Dlaczego nie?Czy XmlSerializer nie opiera się również na atrybucie [Serializable]? – fretje

+0

Dodano przykład. Używam atrybutu [Serializable] przez cały czas, gdy potrzebuję serializacji niestandardowego obiektu. –

0

Edit: usunięto część o [Serializable]

Czy tworząc usługę, lub spożywania go?

Aby utworzyć obiekt, który można przekazać jako parametr metody internetowej, nie trzeba wykonywać żadnych specjalnych czynności. Tak jest, jeśli tworzysz usługę sieciową ASMX.

OTOH, jeśli tworzysz usługę WCF, musisz oznaczyć klasę [DataContract] i wszystkich członków, którzy mają zostać poddani serializacji za pomocą [DataMember].

Jeśli korzystasz z usługi internetowej, wówczas klasy proxy dla obiektu do przekazania powinny zostać wygenerowane po dodaniu odwołania do usługi. Po prostu musisz ich użyć.

+0

Właściwie zarówno robię, jak i konsumuję. Wspomniałem o tym, co robiłem, ale wciąż otrzymuję skargi od VS o konieczności konstruktora bez parametrów w niestandardowym obiekcie (który dodałem, ale bez skutku). –

+0

możesz podać odpowiedni kod i dokładnie * zażalenia * ;-) – fretje

5

Wygląda duplikatu tego question

W każdym razie, wszystkie obiekty biorące udział w interakcjach WS powinien być możliwy do serializacji XML, nie ISerializable (co jest serializacji binarnej). Ponadto powinny być opisane w umowie o świadczenie usług (WSDL), w przeciwnym razie klienci nie będą mogli ich konsumować. This article powinien być przydatny do zrozumienia serializacji XML z usługami sieciowymi XML.

Jednak, jeśli mówimy o naprawdę niestandardowych obiektach (tj. Każdym typie). Powinieneś rozważyć przekazanie ich w formie binarnej: jako kodowany base64 lub jako załącznik. Pytanie, które łączyłem, zawiera odpowiedź, jak to zrobić.

0

Spójrz na to question, aby zobaczyć, jak wdrożyć XML serializacji dla własnych obiektów

Powiązane problemy