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 Web Method, c'est à dire accessible à distance par Web Services !
En effet, il est impossible de passer, par Web Method, une ArrayList, car celle-ci nest pas serialisable. Comment faire, alors, pour récupérer une liste d'objets par Web Services ?
Réponse : il faut alors transformer lArrayList en tableau dobjets serialisables.
Voici, dans notre cas, la marche à suivre :
· Daprè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 dorigine 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 dinitialiser lobjet 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), comme ceci :
· A partir dune liste dobjets de type Places, créer un tableau dobjets 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 lArrayList 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 Web Method puisquil est serialisable.