Pregunta

Esta pregunta está cerca de lo que yo estoy interesado en , pero no del todo.

Tengo una aplicación .NET WinForms escrito en C #. Tengo un control ListView que muestra una matriz de C # objetos. Tengo que engancha de manera que se pueden arrastrar / soltar estos elementos de ListView a una forma diferente en la misma aplicación, y pasa correctamente el conjunto de objetos (tipo Session) al manejador de caída para esa otra forma.

Sin embargo, ahora quiere apoyar la fricción entre procesos / drop en el que ejecutar varias instancias de mi solicitud. Este aparece que se va a trabajar (por ejemplo GetDataPresent tiene éxito), pero en última instancia produce una excepción cuando realmente tratar de recuperar el Data-- no puede lanzar object[] a 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 debe aplicar ISerializable para mis objetos con el fin de hacer este trabajo? Por lo general, yo simplemente trato, pero la implementación de ISerializable para esta clase sería bastante trivial, y me preocupa que pueda haber extraños efectos secundarios de hacerlo.


Actualizar : La implementación ISerializable no help-- el método nunca es llamado. Del mismo modo, añadiendo el atributo Serializable a la clase no tiene ningún impacto en absoluto. Alguna otra idea?

¿Fue útil?

Solución

Se está cruzando una frontera proceso, las referencias a objetos no son válidos en otro proceso. Los soportes de clase DataObject seria objetos para conseguir que a través de la pared, se utiliza BinaryFormatter. Así que, sí, tendrá que aplicar el atributo [Serializable] a su clase y asegurarse de que sus objetos pueden DE / serializar correctamente.

Otros consejos

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 que no entiendo completamente la parte de sesión, probarlo ...

Espero que esta ayuda, Atentamente, Tom.

Se podría utilizar "como" para la fundición, lo que evitará la excepción ( "como" devolverá "nulo" sin lanzar una excepción si la conversión falla) - pero no creo que esto va a resolver su problema (se acaba de evitar la excepción real), ya que estoy de acuerdo lo más probable es que tendrá que hacer su clase Serializable. Se podría probar su hipótesis comentando los campos que serán más difíciles de hacer que funcione. - sólo por ahora para probarlo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top