Frage

Diese Frage ist in der Nähe zu dem, was ich bin interessiert an , aber nicht ganz.

Ich habe eine Anwendung .NET WinForms in C # geschrieben. Ich habe eine ListView Steuerung, die ein Array von C # Objekte anzeigt. Ich habe gehakt es so ein, dass Sie können per Drag / Drop diese Listenansicht Artikel zu einer anderen Form in der gleichen Anwendung, und es geht richtig die Anordnung der Objekte (Typ Session) mit den Drop-Handler für diese andere Form.

Allerdings mag ich jetzt Cross-Prozess ziehen unterstützen / Drop, wo ich mehrere Instanzen von meiner Anwendung ausführen. Diese erscheint , dass es zur Arbeit zu gehen ist (zum Beispiel GetDataPresent gelingt), aber letztlich löst eine Ausnahme aus, wenn ich versuche eigentlich die data-- werfen können nicht object[] zu Session[] abgerufen werden.

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

Wer weiß, wenn ich muss implementieren ISerializable für meine Objekte, um diese Arbeit zu machen? Normalerweise würde ich einfach versuche es, aber ISerializable für diese Klasse Umsetzung wäre durchaus nicht trivial, und ich bin besorgt, dass es seltsam Nebenwirkungen sein kann, dies zu tun.


UPDATE : Implementieren von ISerializable nicht die Methode nicht help-- nie aufgerufen. In ähnlicher Weise zu der Klasse der Serializable Attribut Zugabe hat keine Auswirkungen auf alle. Jede andere Ideen?

War es hilfreich?

Lösung

Sie sind eine Prozessgrenze überqueren, sind Objektreferenzen in einem anderen Prozess nicht gültig. Die Dataobject-Klasse unterstützt Objekte serialisiert sie über die Wand zu bekommen, verwendet es BinaryFormatter. Also, ja, müssen Sie das Attribut [Serializable] auf Ihre Klasse zu übernehmen und sicherstellen, dass Ihre Objekte können de / serialize richtig.

Andere Tipps

Ok Dies ist ein Schuss, sondern eine ganze Reihe von Sitzungen zu verwenden, versuchen Sie es zu tun individuell wie dieses ...

   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 }

einen Versuch wert, außer mir in den Fuß zu schießen, wie ich nicht vollständig verstehen, die Teil Session, versuchen Sie es ...

Hope, das hilft, Freundliche Grüße, Tom.

Sie könnten „als“ zum Gießen verwendet werden, die die Ausnahme vermeiden ( „as“ zurückkehren wird „null“, ohne eine Ausnahme auszulösen, wenn die Umwandlung fehlschlägt) - aber ich glaube nicht, das Ihr Problem lösen wird (es wird nur vermeiden die tatsächliche Ausnahme), wie ich es wahrscheinlich zustimmen werden Sie Ihre Klasse Serializable machen. Sie könnten Ihre Hypothese testen, indem Sie die Felder zu kommentieren heraus, das härter sein wird, damit es funktioniert -. Nur für jetzt, es zu testen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top