Préambule
Ce tutoriel explique comment passer un tableau d'objets par WebMethods.
Introduction
Lorsque nous travaillons en architecture n-Tiers, le découpage de l'application est tel qu'il est souvent utile de passer des tableaux d'objets de couche en couche.
Pour l'exemple, prenons la méthode GetListPlaces() qui retourne une ArrayList d'objets de type Place. Tout marche bien lorsque les appels entre couche restent locaux (par DLL), mais tout se complique si cette méthode GetListPlaces() est une WebMethod, c'est à dire accessible à distance par Web Services !
En effet, il est impossible de passer, par WebMethod, une ArrayList, car celle-ci n'est pas serialisable. Comment faire, alors, pour récupérer une liste d'objets par Web Services ?
Réponse : il faut alors transformer l'ArrayList en tableau d'objets serialisables.
Mode opératoire
Voici, dans notre cas, la marche à suivre :
D'après la classe
Place originale (ci-dessous), faire une classe dite « Conteneur », c'est-à-dire composée de toutes les propriétés de la classe d'origine mais sans aucune méthode (à part les constructeurs...). Appelons cette classe
PlaceInfos. Dans cette classe conteneur (
PlaceInfos), la méthode PlaceInfos (2 surcharges) correspond aux constructeurs : un constructeur vide, obligatoire, et un constructeur permettant d'initialiser l'objet
PlaceInfos. Voici ce constructeur :
public PlaceInfos(string idPlace, string labelPlace)
{
this.IdPlace = idPlace;
this.LabelPlace = labelPlace;
}
A ce stade, nous sommes donc capables d'instancier des objets de type
Place, et des objets de type
PlaceInfos. Chaque objet de type
PlaceInfos n'est en fait qu'une "copie", une "image", d'un objet
Place correspondant. La différence : l'objet
PlaceInfos ne contient aucune méthode et est donc serialisable, c'est à dire qu'il pourra passer par Web Method... L'idée est alors de transformer la liste d'objets
Place (non serialisables) fournie par la méthode GetListPlaces() en tableau de
PlaceInfos (serialisables).
A partir d'une liste d'objets de type
Places, créer un tableau d'objets de type
PlaceInfos, comme ceci :
// Récupérer toutes les pièces
ArrayList allPlaces = GetListPlaces(); // Fourni une ArrayList d'objets Place
// Pour chaque pièce trouvée, créer un objet PlaceInfos correspondant
foreach (string onePlace in allPlaces
{
// Créer un objet de type PlaceInfos et le charger à la volée
PlaceInfos myPlaceInfos = new PlaceInfos(onePlace.IdPlace, onePlace.LabelPlace);
// Ajouter l'objet dans une ArrayList
listOfPlacesInfos.Add(myPlaceInfos);
}
// Transformer l'ArrayList de PlaceInfos en un tableau de PlaceInfos
// Cette manipulation permet de serialiser ce tableau et ainsi l'utiliser en webmethod (une ArrayList n'est pas serialisable...)
return (PlaceInfos[])listOfPlacesInfos.ToArray(typeof(PlaceInfos));
Le tableau ainsi retourné peut être retourné par une WebMethod puisqu'il est serialisable.