Der Kontext ist wie folgt
Eine Lösung für dieses Problem ist der SerializationBinder, mit dem ich in gewisser Weise von einem Typ zum anderen "umleiten" kann.
Ich möchte daher einen SerializationBinder erstellen, um diese Anforderung zu erfüllen. Dies muss jedoch durch Erfüllung der folgenden Anforderungen erfolgen.
Ist das möglich oder träume ich? Gibt es etwas da draußen, das das schon tut? Ich nehme an, das ist ein häufiges Problem.
Bis jetzt sehe ich keinen einfachen Weg, 3 zu machen und überhaupt nicht 4.
Hier ist ein Versuch
%Vor%Dies könnte funktionieren (anstelle Ihrer Überschreibung).
%Vor%Dann müssen Sie nur die Funktion GetFlatTypeMapping implementieren (ohne sich über generische Argumente Gedanken zu machen).
Sie müssen typeof(List<>)
und typeof(Dictionary<,>)
(oder jedes andere generische Element, das Sie verwenden möchten) zurückgeben, wenn Sie dazu aufgefordert werden.
nb: Ich sagte typeof(List<>)
! nicht typeof(List<something>)
... das ist wichtig.
Haftungsausschluss: wegen der Regex "(? [^]] *)", unterstützt dieser Snipped nicht verschachtelte generische Typen wie List<List<string>>
... Sie werden es ein wenig optimieren müssen um es zu unterstützen!
Obwohl es Ihre Frage möglicherweise nicht beantwortet, könnte dies Ihr Problem lösen:
Ich konnte alle außer einer für die Deserialisierung erforderlichen Assemblierung neben einer Objektstruktur serialisieren. Der Trick besteht darin, die Objektstruktur mithilfe der Reflektion auf Typen und die Assemblys zu überprüfen, in denen sie definiert sind. Sie können dann die Assemblys als binäre Daten in ein Serialisierungsobjekt schreiben und in eine Anwendungsdomäne laden, in der Sie den Rest deserialisieren können der Objektstruktur.
Sie müssen die AppDomain-Behandlung, das Stammobjekt und einige Basisklassen in eine Assembly einfügen, die sich nicht ändert, und alles andere wird in Assemblys in Abhängigkeit von diesem "Anker" definiert.
Upsides:
Nachteile:
Aber hey, Kommunikation bricht nicht ab, es sei denn, Sie haben andere Client-Versionen und dann können Sie das Bootstrapping auf Handshake durchführen.
Leider kann ich den Code nicht bereitstellen, da er zu komplex und zu spezifisch ist. Aber ich teile einige Einsichten in diese anderen Antworten von mir:
Unterschied zwischen DataContract-Attribut und Serializable-Attribut in .net
Sie müssen das AssemblyResolve-Ereignis verknüpfen, wenn DisallowApplicationBaseProbing = true ist
Ist es eine schwierige Anforderung, dass Sie den BinaryFormatter für Ihre De / Serialisierung verwenden müssen?
Wenn es nicht schwierig ist, den BinaryFormatter für die Serialisierung zu verwenden, sollten Sie alternative Serialisierungsmethoden wie JSON.Net oder ProtoBuf.Net in Betracht ziehen. Jede dieser Optionen erstellt plattform- und versionsunabhängige Serialisierungen Ihrer Daten.
Alternativ können Sie die binäre Serialisierung selbst durchführen (die sowohl schneller als auch kleiner als der BinaryFormatter ist, aber im Allgemeinen Code-intensiver, da Sie Serializer und Deserializer im Wesentlichen identisch zueinander schreiben müssen.
Wenn Sie BinaryFormatter verwenden müssen, stellen Sie sicher, dass Sie es mit FormatterAssemblyStyle.Simple konstruieren, um Versionierungsprobleme zu umgehen. Das sagt ihm, die pedantische Überprüfung der Assembly-Version nicht zu machen.
Tags und Links .net c# serialization backwards-compatibility binary-serialization