Kann ich Generics ohne einen Verweis auf den Typ deserialisieren?

8

Ich versuche, eine Klasse in einer XML-Datei zu speichern / zu laden, die generische Typen enthält, mit einem DataContractSerializer . Ich habe das Speichern funktioniert, aber habe festgestellt, dass ich es nicht laden kann, weil ich nicht die Liste der bekannten Typen für den Deserializer habe.

Gibt es eine Möglichkeit, diese Klasse zu serialisieren / deserialisieren, sodass ich sie deserialisieren kann, ohne direkt auf einen der gespeicherten Typen zu verweisen?

Hier ist meine SessionVariables Klasse, die ich versuche zu speichern / zu laden:

%Vor%

Die verschiedenen Module der Anwendung erweitern die ISessionVariables -Schnittstelle, um ihre eigenen Sitzungsvariablen zu erstellen, wie folgt:

%Vor%

Und eine Singleton-Instanz der Klasse SessionVariables wird verwendet, um auf Sitzungsvariablen wie folgt zuzugreifen:

%Vor%

Ich habe das Speichern so gemacht:

%Vor%

Diese Methode funktioniert jedoch nicht, um die Klasse zu deserialisieren, da ich ihre bekannten Typen nicht kenne.

Kann ich generische Typen serialisieren und deserialisieren, wenn ich keine direkten Bibliotheksreferenzen für einen der verwendeten Typen habe? Und wenn ja, wie?

    
Rachel 27.11.2013, 14:34
quelle

2 Antworten

4

Das Problem hier ist, dass Sie nicht nur Daten serialisieren wollen, sondern auch Daten über Ihre Daten serialisieren möchten, dh (den dramatischen Chipmunk aufrufen) Metadaten .

Diese Metadaten sind in diesem Fall die Typen der Modelle, die ursprünglich die Daten enthielten. Normalerweise ist dies kein Problem, aber wie Sie herausgefunden haben, wenn Sie Polymorphismus in Ihrem Entwurf nutzen, kann Ihre einzelne Sammlung zwei oder mehr verschiedene Typen enthalten, von denen jeder zu seinem ursprünglichen Typ deserialisiert werden muss.

Dies wird normalerweise dadurch erreicht, dass diese Type-Metadaten im serialisierten Ergebnis gespeichert werden. Verschiedene Serialisierungsmethoden tun dies auf verschiedene Arten. Die Xaml-Serialisierung verwendet XML-Namespaces, die .NET-Namespaces zugeordnet sind, und benennt die Elemente nach dem ursprünglichen Typnamen. Json.net führt dies über einen bestimmten benannten Wert durch, der im json-Objekt gespeichert ist.

Der Standard-DataContractSerializer ist nicht Typ-bewusst. Daher müssen Sie es durch eine Version ersetzen, die das .NET-Typsystem versteht und Typ-Metadaten in das resultierende XML serialisieren / deserialisieren kann. Zum Glück existiert bereits ein Framework, das NetDataContractSerializer .

Und so packt man eine Link-Only-Antwort. Die Aristokraten.

    
Will 02.12.2013, 20:34
quelle
0

Sie können dies mit einem benutzerdefinierten DataContractResolver erreichen. Auf diese Weise können Sie sich an die Deserialisierungspipeline anschließen und basierend auf dem Typ / Namespace, der im serialisierten Diagramm gefunden wird, einen Typ zum Deserialisieren bereitstellen.

Hier ist ein guter Artikel dazu: Ссылка

IDesign verfügt über eine Implementierung eines Resolvers, der für die dynamische Erkennung von Typen auf ihrer Site verwendet werden kann: Ссылка (Sie wird wahrscheinlich einige Änderungen vornehmen müssen, um mit Generika umzugehen)

    
JMarsch 09.12.2013 15:24
quelle