C # DataContract Serialisierung, wie zu bereits existierender Instanz deserialisieren

8

Ich habe eine Klasse, die ein statisches Verzeichnis aller existierenden Instanzen enthält, die zur Kompilierzeit definiert werden.

Grundsätzlich sieht es so aus:

%Vor%

Es gibt andere Felder, und die Klasse ist abgeleitet, aber das ist für das Problem egal.

Nur das id wird serialisiert. Wenn eine Instanz dieses Typs deserialisiert wird, möchte ich die Instanz, die erstellt wurde, als statisches Feld ( A , B oder C ) verwenden, indem Sie Foo.Get(id) anstelle einer neuen Instanz verwenden.

Gibt es einen einfachen Weg, dies zu tun? Ich habe keine Ressourcen gefunden, die ich verstehen konnte.

    
Stefan Steinegger 21.12.2009, 17:50
quelle

4 Antworten

16

Während der Deserialisierung verwendet es (AFAIK) immer ein neues Objekt ( FormatterServices.GetUninitializedObject ), aber um es nach der Deserialisierung durch die Objekte zu ersetzen (aber bevor sie an den Aufrufer zurückgegeben werden), können Sie Implementieren Sie IObjectReference wie folgt:

%Vor%

done ... Beweis:

%Vor%

Beachten Sie, dass für Teilvertrauenszenarios auf MSDN hier zusätzliche Anmerkungen zu diesem Thema vorliegen.

    
Marc Gravell 01.01.2010, 23:43
quelle
3

Ich hatte ein ähnliches Problem und die beste Lösung, die ich gefunden habe, war das Hinzufügen einer Wrapperklasse, die Instanzen desjenigen verwaltet, der serialisiert werden muss.

Ich bin mir nicht sicher über die genaue Unterschrift mit Verträgen. Ich habe SerializableAttribute benutzt, und damit habe ich etwas ausgesehen. so:

%Vor%     
ironic 21.12.2009 17:57
quelle
0

Mit können Sie möglicherweise einen Schritt in Richtung Ihrer Suche machen OnDeserializingAttribute . Das wird Ihnen jedoch wahrscheinlich nur erlauben, Eigenschaften zu setzen (damit Sie eine Kopie haben können, die alle Eigenschaften der aktuellen Instanz mit Ihrer statischen Instanz auffüllt.)

Ich denke, wenn Sie Ihre statischen Instanzen wirklich zurückgeben möchten, müssten Sie wahrscheinlich Ihren eigenen Deserializer schreiben ...

Nicht getestet, aber ich würde annehmen, dass Sie einen Deserializer ziemlich einfach so implementieren können:

%Vor%

Beachten Sie, dass Sie etwas tun müssen, um die ID zu erhalten, da sie in Ihrem Code privat ist. Dies setzt auch voraus, dass Sie die XML-Serialisierung verwenden. Ersetzen Sie die Vererbung mit dem, was Sie tatsächlich verwenden. Und schließlich bedeutet dies, dass Sie diesen Typ bei der Deserialisierung Ihrer Objekte instanziieren müssen, was eine Änderung des Codes und / oder der Konfiguration zur Folge haben kann.

    
Chris Shaffer 21.12.2009 18:18
quelle
0

Kein Problem, benutze nur 2 Klassen. In getObject-Methode erhalten Sie Ihr vorhandenes Objekt

%Vor%

Dann beim Deserialisieren:

%Vor%     
Alexander 23.11.2012 06:23
quelle