CodeS-SourceS
Rechercher un code, un tuto, une réponse

[C#] Passer un tableau d'objets par WebMethods (Serialisation)

Mai 2017


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.

A voir également

Publié par zigxag.
Ce document intitulé «  [C#] Passer un tableau d'objets par WebMethods (Serialisation)  » issu de CodeS-SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
[c#] opérations cross threads - utilisation des delegations synchrones / asynchrones
[c#]comment récupérer facilement des données d'un fichier xml ?