2016-09-29 3 views
1

Ich habe ein Stück Code, das ungefähr so ​​aussieht:Serialisierung einen Verweis auf einen statischen Nur-Lese-Mitglied

public static class MyStaticClass 
{ 
    public static readonly MyObject1 object1 = new MyObject1(); 
} 

[Serializable] 
public class MyOtherClass 
{ 
    public MyObject1 Obj { get; } = MyStaticClass.object1; 
} 

Wenn Deserialisieren eine Instanz von MyOtherClass (Standard binäre Serialisierung verwenden), Obj ist nicht mehr das gleiche Objekt als MyStaticClass.Objekt1. Gibt es eine Möglichkeit, diese Referenz automatisch beizubehalten, oder muss ich sie einfach über eine Zeichenfolge oder eine andere Kennung rekonstruieren? Wenn ja, was wäre der empfohlene Weg, diese Referenz sauber wiederherzustellen?

+0

Ja, verwenden Sie ['IObjectReference. GetRealObject() '] (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.iobjectreference.getrealobject (v = vs.110) .aspx). Ein Beispiel dafür ist in [docs] (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.iobjectreference.getrealobject (v = vs.110) .aspx # Anchor_3 zu finden). – dbc

+0

* Standard binäre Serialisierung * bedeutet 'BinaryFormatter', richtig? – dbc

+1

Related: [Wie man statische Referenzobjekt serialisieren und deserialisieren?] (Https://stackoverflow.com/questions/32375207/how-to-serialize-deserialize-static-reference-object/32509817#32509817) und [Einhängen in die Deserialisierungsprozess] (https://stackoverflow.com/questions/12692860/hooking-into-the-deserialization-process). – dbc

Antwort

0

Gibt es eine Möglichkeit, automatisch, dass das Bezug zu behalten

, die auf Ihrer Definition von „automatisch“ ab, aber vorausgesetzt, Sie bedeuten „ohne zusätzlichen Code zu schreiben“, lautet die Antwort „Nein“.

Bei der Serialisierung geht es um Daten, nicht um Objekte. Wenn Sie das Objekt deserialisieren, sind bei den Implementierungen der Bestandsdeserialisierung nur die Daten bekannt, die gespeichert wurden. Was ist wie es sein sollte; Eine Deserialisierungsimplementierung für allgemeine Zwecke würde nicht einmal wissen, wo nach einem Objekt wie diesem gesucht werden soll, und eine vorhandene Referenz verwenden, so dass sie das gesamte In-Memory-Objektdiagramm von allen Wurzeln durchsuchen müsste.

Sie müssen einen Mechanismus bereitstellen, um dies explizit zu behandeln. Je nachdem, welche Serialisierungsmethode Sie verwenden, können Sie möglicherweise den gesamten Prozess anpassen, sodass Sie nicht die gesamten MyObject1 Daten serialisieren müssen, sondern nur eine Art von Markierung speichern, die Ihre benutzerdefinierte Deserialisierung verwenden kann ursprüngliches Objekt.

Alternativ kann Ihre Anpassung nur auf MyObject1 beruhen, die eine Art Gleichheit implementiert, sodass Sie das deserialisierte Objekt vergleichen und seine Referenz durch die Referenz "stock" ersetzen können, wenn die beiden Objekte gleich sind.

Wenn Sie eine Serialisierungsmethode verwenden, die die IObjectReference.GetRealObject() genannten in the comments unterstützt, würde das auch funktionieren.

Aber was auch immer Sie tun, Sie müssen es selbst tun. (Oder verwenden Sie eine Bibliothek eines Drittanbieters, die eine Funktion wie diese out of the box unterstützt & hellip; ich weiß nichts, aber das bedeutet nicht, dass es nicht existiert.)

+0

Meine aktuelle beste Idee, um einfach einen Marker wie Sie sagten zu speichern, und haben eine Methode in 'MyStaticClass', die diesen Marker analysiert, um das richtige Objekt zurückzugeben. Danke für deinen Beitrag! –

Verwandte Themen