Question

Cette question est proche de ce que je suis intéressé par , mais pas tout à fait.

J'ai une application .NET WinForms écrit en C #. J'ai un contrôle ListView qui affiche un tableau d'objets C #. Je l'ai accroché vers le haut de sorte que vous pouvez glisser / déposer ces éléments ListView à une forme différente dans la même application, et il passe correctement le tableau d'objets (type Session) au gestionnaire de gouttes pour cette autre forme.

Cependant, je veux maintenant soutenir glisser / déposer inter-processus où j'exécuter plusieurs instances de mon application. Cette apparaît qu'il va travailler (par exemple GetDataPresent réussit), mais jette finalement une exception lorsque je tente en fait de récupérer le data-- ne peut pas lancer object[] à Session[].

if (e.Data.GetDataPresent("Fiddler.Session[]"))
{
   Session[] oDroppedSessions;
   try
   {
      oDroppedSessions = (Session[])e.Data.GetData("Fiddler.Session[]");
   }
   catch (Exception eX)
   {  // reaches here 
   }
}

Quelqu'un sait si je doit mettre en œuvre ISerializable pour mes objets afin de faire ce travail? Ordinairement, je voudrais simplement essayer, mais la mise en œuvre ISerializable pour cette classe serait tout à fait non-trivial, et je suis inquiet qu'il peut y avoir d'étranges effets secondaires de le faire.


UPDATE : La mise en œuvre ISerializable ne help-- pas la méthode est jamais appelée. De même, en ajoutant l'attribut Serializable à la classe n'a pas d'impact du tout. D'autres idées?

Était-ce utile?

La solution

Vous traversez une frontière de processus, les références de l'objet ne sont pas valables dans un autre processus. La classe DataObject prend en charge les objets sérialisation pour les obtenir à travers le mur, il utilise BinaryFormatter. Alors, oui, vous devez appliquer le [Serializable] attribut à votre classe et assurez-vous que vos objets peuvent de / sérialisation correctement.

Autres conseils

Ok c'est un coup de feu, au lieu d'utiliser toute une série de séances, essayez de le faire comme individuellement ce ...

   Session[] oDroppedSessions;
   try
   {
      if (e.Data.GetData("Fiddler.Session[]") != null){
          object[] objs = e.Data.GetData("Fiddler.Session[]");
          if (objs != null && objs.Length > 1){
             oDroppedSessions = new Session[objs.Length];
             int nIndex = 0;
             foreach(object obj in objs){
                if (obj is Session){
                  oDroppedSessions[nIndex] = (Session)obj;
                  nIndex++;
                }
             }
          }
      }
   }
   catch (Exception eX)
   {  // reaches here }

vaut le coup, autre que moi tirer dans le pied que je ne comprends pas bien la partie de session, essayez ...

Hope this helps, Meilleures salutations, Tom.

Vous pouvez utiliser « comme » pour la coulée qui évitera l'exception ( « comme » retournera « nul » sans jeter une exception si le casting échoue) - mais je ne pense pas que cela résoudra votre problème (il va juste éviter l'exception réelle), comme je suis d'accord, il est probable que vous aurez à faire votre classe Serializable. Vous pouvez tester votre hypothèse en commentant les champs qui seront plus difficiles à faire fonctionner -. Juste pour l'instant pour le tester

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top