IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

Comment faire pour sérialiser des méthodes ?


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Piet
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Par défaut Comment faire pour sérialiser des méthodes ?
    Bonjour,

    De façon résumée, je souhaite sérialiser des actions contenues dans une classe pour une exécution différée de celles-ci (voir le contexte et l'exemple plus bas pour ceux qui souhaitent).

    Est-ce prévu par le framework? Un lien? Une idée? Une remarque?

    Je suis preneur!

    Merci d'avance.


    Contexte :
    Une application client/serveur implémentant le remoting permet d'envoyer des actions à des clients.
    Interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public interface IRemoteOperation
    et les opérations de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class RemoteOperation : MarshalByRefObject, RemotingInterfaces.IRemoteOperation
    Je peux par exemple envoyer une action au pc "pcName" sur le port "port' permettant de lancer un process :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    IRemoteOperation op = (RemotingInterfaces.IRemoteOperation)Activator.GetObject(
        typeof(RemotingInterfaces.IRemoteOperation),
        "tcp://" + pcName + ":"+port+"/RemoteOperation");
    if (op.ProcessLaunch(tbx_ProcessToLaunch.Text,this.cbx_UseShellExecute.Checked,this.cbx_Impersonate.Checked))
    {
        //OK action
    }
    else
    {
        //failure action
    }
    la définition de ProcessLaunch étant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bool ProcessLaunch(string processToLaunch, bool useShellExecute, bool mustImpersonate);
    et renvoyant un booléen représentant que l'action s'est produite correctement sur le client.

    Lorsque le client n'est pas disponible (pc éteint),
    op.ProcessLaunch() lance une exception et l'action n'est évidemment pas exécutée. A ce moment, il faudrait que l'action n'ayant pas abouti se mette en attente (dans un fichier ou une DB) jusqu'à ce que le client exécute l'action.

    Mon problème : je ne sais pas comment sérialiser une méthode et l'exécuter en différé.

    points d'attention : nombre variable de paramètres dans les fonctions.

    Encore merci.

  2. #2
    Membre Expert
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Par défaut
    De base, ça n'est pas prévu par le framework.

    Mais plutôt que de sérialiser une méthode, ce qui me paraît un poil impossible, pourquoi ne pas sauvegarder plutôt un nom ou une référence vers la méthode ?

    Par exemple, la client doit effectuer une méthode d'update mais il est éteint. Alors la référence update001 est enregistré dans la base de données et quand le client voudra exécuter cette méthode, il ira la demander au serveur grâce à cette référence.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  3. #3
    Membre confirmé Avatar de Piet
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Par défaut
    Oui, mais donner une référence vers la méthode pour l'exécuter signifie que je dois toucher à plusieurs endroits à mon code chaque fois que j'implémente une nouvelle fonctionnalité, ce qui aurait été inutile avec un style de sérialisation.

    J'utilise déjà le remoting pour éviter de faire une double référence dans mon code, si maintenant je dois y passer, je vais peut-être réviser l'utilisation du remoting qui me fait perdre certaines ouvertures.

    Enfin, je suppose qu'il va falloir coder...

    Merci beaucoup pour ta réponse en tout cas.

    Si d'autres personnes ont des idées... ou fait quelque chose du même style ou un lien qui pourrait m'avancer... Je suis toujours preneur! ;-)

  4. #4
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2006
    Messages : 317
    Par défaut
    A priori, il est possible de sérialiser une lambda expression. Néanmoins, ça a l'air un peu casse cou et ne semble pas réellement correspondre à ce que tu attends:
    http://reverseblade.blogspot.com/200...pressions.html

    As tu songé à mettre en place un système de transaction sur tes opérations ?

    Il est peut etre préférable de simplement arrêter le traitement, revenir à l'état de départ que de garder une trace de celui ci et le relancer à son retour.

  5. #5
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Avec la réflexion et son attirail de warrior, il doit être possible d'exécuter du code arbitraire. Après, il y a des histoires de sécurité (CAS, si je ne me trompe, Code Access Security) qui encadrent la chose, mais ça doit être possible.

    je m'étais posé la question en faisant en serveur métier de cache. Quand on interroge une base SQL, on lui file un prédicat (clause WHERE) indiquant quels records ramener ; j'aurais aimer faire pareil en .Net, avec une méthode remoting du style ICollection<Client> GetClient(Predicate<Client> pred), mais je sais pas comment

  6. #6
    Membre Expert Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Par défaut
    Citation Envoyé par Guulh Voir le message
    je m'étais posé la question en faisant en serveur métier de cache. Quand on interroge une base SQL, on lui file un prédicat (clause WHERE) indiquant quels records ramener ; j'aurais aimer faire pareil en .Net, avec une méthode remoting du style ICollection<Client> GetClient(Predicate<Client> pred), mais je sais pas comment
    Tu peux regarder par là.

    http://blogs.msdn.com/mattwar/

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/02/2007, 18h03
  2. [VB6]Comment faire pour récuperer des donnée sur un mp3 ou wav ?
    Par MegaBigBoss dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 13/06/2006, 17h08
  3. [c#] comment faire pour garder des noeuds ouverts treeview?
    Par irnbru dans le forum Windows Forms
    Réponses: 2
    Dernier message: 11/11/2005, 01h47
  4. Réponses: 4
    Dernier message: 14/10/2005, 15h02
  5. comment faire pour developper des prog en win32
    Par rhodan51 dans le forum Autres éditeurs
    Réponses: 11
    Dernier message: 09/11/2003, 20h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo