Accès à un même objet depuis 2 webservices, sérialisation

Résolu
rstboris Messages postés 8 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 21 juin 2005 - 16 juin 2005 à 17:12
rstboris Messages postés 8 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 21 juin 2005 - 21 juin 2005 à 16:03
Salut,
Je developpe actuellement un webservice qui doit gérer des accès à une base de donnée et renvoyant des objets de type "Personne" et des "Reunion". Je suis assez débutant en matière de webservice et on m'a conseillé de faire 3 webservices: un pour la connection au serveur SQL et les requetes (ne renvoie presque que des DataSet), un pour gerer les personnes, et un pour les réunions. Je developpe sous VS.Net (en C#) et j'ai donc un projet avec 3 .asmx (PersonneManager, ReunionManager et SQL). J'ai aussi créé les struct "Personne", "Reunion" (...) qui sont simplement dans un dossier de mon projet... Mon problème est survenu quand j'ai voulu utiliser le même objet réunion comme résultat d'un webservice dans un autre. En effet, si je déclare un objet PersonneManager.Personne, je ne peux ni le caster, ni en faire quoi que ce soit avec ReunionManager, puisque le type attendu est ReunionManager.Personne. C'est fort embetant vu que c'est le même... J'ai donc cherché à mettre les structures dans le meme namespace qu'un autre webservice (sql, par exemple, vu qu'il est "au dessus"), mais que nenni! Il faut aussi changer le sql.Personne en PersonneManager.Personne. J'ai donc tenté, au niveau de la page asp qui consomme le webservice, de créer une méthode pour convertir un type en un autre en sérialisant/désérialisant l'objet et en le castant.
Mes questions sont donc les suivantes:
- Est-ce que l'organisation a l'air correcte?
- Comment se fait-il que j'arrive pas à désérialiser une "reunion" alors que ca marche pour une "personne"?

//initialisation d'une PersonneManager.Personne
pM.personne p = pM.authPersonne(tUser.Text, tPass.Text); //auth pour authenticate :), ca renvoie juste un new personne(....)
//initialisation d'une sql.Personne par convertion
sql.personne pSQL = (sql.personne)convertisseur.ConvertWSInfoToLocalInfo(p,
typeof(sql.personne));

rM.reunion r = csR.getInstanceReunion2(1,"popo", "reger",
new DateTime(2005,6,15,15,12,0,0),
new DateTime(2005,6,17,15,12,0,0),rep,3,
true ); // ca c'est juste un new


sql.reunion rSQL = (sql.reunion)convertisseur.ConvertWSInfoToLocalInfo(r,
typeof(sql.reunion));

Label1.Text = p.login + " " + pSQL.login + " " + r.titre + "" +rSQL.titre // affiche 2 fois le login et une fois le titre

//et la fameuse méthode ConvertWSInfoToLocalInfo


public
static Object ConvertWSInfoToLocalInfo(Object WSInfo, System.Type LocalInfoType)
{
System.Xml.Serialization.XmlSerializer serializer =
new System.Xml.Serialization.XmlSerializer(WSInfo.GetType());
StringWriter stringWriter =
new StringWriter();
serializer.Serialize(stringWriter, WSInfo);
String strXml = stringWriter.ToString();
StringReader stringReader =
new StringReader(strXml);
System.Xml.Serialization.XmlSerializer deserializer =
new System.Xml.Serialization.XmlSerializer(LocalInfoType);
Object o = deserializer.Deserialize(stringReader);

return o;
}
Voila, si quelqu'un avait une idée....

3 réponses

rstboris Messages postés 8 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 21 juin 2005
21 juin 2005 à 16:03
bon, je remercie tout le monde pour ce flot abondant de réponse, j'ai pas eu le temps de tout lire, désolé !
je crois que j'ai un début de réponse, je suppose en effet que si personne n'a répondu, c'est parce que ma question était trop dure et tout le monde se la posait aussi
J'ai donc appris qu'on peut sérialiser en utilisant SOAP plutot que XmlSerializer (bien que je fasse pas vraiment la différence entre les 2). Dans mon webservice, j'ai donc ajouté des choses comme ca pour chaque webmethod qui utilise un de mes types perso:

[WebMethod()]


[SoapRpcMethod]


[SoapInclude(
typeof(reunion))]

pour faire joli et accessoirement pour permettre une sérialisation d'objets complexes: en effet, mes objets reunion, personne, etc. avaient un ou plusieurs attributs publics d'un type que j'avais créé moi même. Par exemple une réunion utilise une ArrayList de personne, pour savoir qui est dedans...
Apres, lors de la consommation du webservice, j'utilise exactement la même méthode pour sérialiser/désérialiser les objets. Ca me permet de transformer un objet de type personneManager.personne en reunionManager.personne. Ca me semble assez louche de faire ca alors que je viens de voir que c'est justement la sérialisation avec le package XmlSerialization qui foirait, mais comme ca semble marcher, je prie juste pour que ca continue comme ca

C'est con quand même, j'avais essayé avec des XmlInclude(typeof(reunion)) et bien sur ca passait pas... J'étais tellement proche, pourtant
Bon j'espère donc que ca servira un jour à quelqu'un
3
rstboris Messages postés 8 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 21 juin 2005
16 juin 2005 à 17:20
arg, je trouve pas le bouton éditer... certains l'auront peut-être remarqué, il y a une faute ou 2 de copier coller... Et puis j'ai oublié de signaler que la sérialisation de l'objet reunion marche correctement (j'ai vérifié la strXml), donc c'est vraiment au niveau de la désérialisation que ca foire
0
rstboris Messages postés 8 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 21 juin 2005
21 juin 2005 à 15:32
je trouve tjs pas!
(up!)
0
Rejoignez-nous