2010-01-21 20 views
7

This question está cerca de lo que me interesa, pero no del todo.Arrastrar y soltar proceso cruzado de tipo de objeto personalizado en WinForms C#

Tengo una aplicación .NET WinForms escrita en C#. Tengo un control ListView que muestra una matriz de objetos C#. Lo he conectado para que pueda arrastrar/soltar estos elementos de vista de lista en una forma diferente en la misma aplicación, y pasa correctamente la matriz de objetos (tipo Session) al manejador de soltar para esa otra forma.

Sin embargo, ahora quiero admitir la función de arrastrar/soltar entre procesos donde ejecuto varias instancias de mi aplicación. Este aparece que va a funcionar (por ejemplo, GetDataPresent tiene éxito), pero finalmente arroja una excepción cuando en realidad intento recuperar los datos. No puedo convertir object[] en Session[].

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

Alguien sabe si hay que aplicar ISerializable para mis objetos con el fin de hacer este trabajo? Por lo general, simplemente lo intento, pero la implementación de ISerializable para esta clase sería bastante no trivial, y me preocupa que pueda haber extraños efectos secundarios de hacerlo.


ACTUALIZACIÓN: La implementación de ISerializable no help-- el método nunca es llamado. Del mismo modo, agregar el atributo Serializable a la clase no tiene ningún impacto. ¿Alguna otra idea?

+0

Agregue una línea 'Console.WriteLine (string.Format ("Excepción capturada. Los detalles son {0}", eX.ToString()));' en el bloque de captura. ¿Cuál sería el mensaje? – t0mm13b

+0

"no se puede lanzar el objeto [] a la sesión []" – EricLaw

Respuesta

4

Estás cruzando un límite de proceso, las referencias de objeto no son válidas en otro proceso. La clase DataObject admite la serialización de objetos para cruzarlos, utiliza BinaryFormatter. Por lo tanto, sí, deberá aplicar el atributo [Serializable] a su clase y asegurarse de que sus objetos se puedan serializar correctamente.

+0

Sí, eso es a lo que le tenía miedo. ¿Alguna idea de si voy a introducir regresiones de rendimiento si implemento ISerializable? La serialización binaria de este objeto puede ser cientos de KB. – EricLaw

+0

Háganos saber cuando lo descubra por favor. –

+0

Hmmm ...implementar ISerializable no ayuda-- nunca se llama al método. Del mismo modo, agregar el atributo Serializable a la clase no tiene ningún impacto. ¿Alguna otra idea? – EricLaw

-1

Puede usar "como" para transmitir, lo que evitará la excepción ("como" devolverá "nulo" sin lanzar una excepción si el lanzamiento falla) - pero no creo que esto resuelva su problema (lo hará solo evite la excepción real), como estoy de acuerdo, es probable que deba hacer que su clase sea serializable. Puede probar su hipótesis comentando los campos que serán más difíciles de hacer funcionar, solo por ahora para probarla.

+1

-1: intercambiar una 'InvalidCastException' por una' NullReferenceException' es una pérdida de información. La palabra clave 'as' es buena si espera que un lanzamiento * pueda * fallar. De lo contrario, es malo, y lo he visto sobreutilizado mucho. –

0

Muy bien, este es un tiro, en lugar de utilizar toda una serie de sesiones, trata de hacerlo de forma individual como esto ...

 
    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 } 

Vale la pena un tiro, aparte de pegarme un tiro en el pie, ya no lo hago entiendo completamente la parte de la sesión, pruébelo ...

Espero que esto ayude, Saludos cordiales, Tom.