Ich versuche, eine Klasse in eine XML-Datei zu speichern/zu laden, die generische Typen enthält, die eine DataContractSerializer
verwenden. 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.Kann ich Generics ohne einen Verweis auf den Typ deserialisieren?
Gibt es eine Möglichkeit zum Serialisieren/Deserialisieren dieser Klasse, die es mir erlauben würde, es zu deserialisieren, ohne direkt auf einen der gespeicherten Typen zu verweisen?
Hier ist meine SessionVariables
Klasse, die ich zu Speichern/Laden versuche:
[DataContract]
public class SessionVariables
{
[DataMember]
private Dictionary<Type, ISessionVariables> _sessionVariables = new Dictionary<Type, ISessionVariables>();
private object _syncLock = new object();
public T Get<T>()
where T : ISessionVariables, new()
{
lock (_syncLock)
{
ISessionVariables vars = null;
if (_sessionVariables.TryGetValue(typeof(T), out vars))
return (T)vars;
vars = new T();
_sessionVariables.Add(typeof(T), vars);
return (T)vars;
}
}
public IList<Type> GetKnownTypes()
{
IList<Type> knownTypes = new List<Type>();
knownTypes.Add(this.GetType().GetType()); // adds System.RuntimeType
foreach (Type t in _sessionVariables.Keys)
{
if (!knownTypes.Contains(t))
knownTypes.Add(t);
}
return knownTypes;
}
}
Die verschiedenen Module der Anwendung erweitern die ISessionVariables
Schnittstelle ihre eigene Reihe von Session-Variablen zu erstellen, wie folgt aus:
[DataContract]
public class ModuleASessionVariables : ISessionVariables
{
[DataMember]
public string ModuleA_Property1{ get; set; }
[DataMember]
public string ModuleA_Property2 { get; set; }
}
[DataContract]
public class ModuleBSessionVariables : ISessionVariables
{
[DataMember]
public string ModuleB_Property1{ get; set; }
[DataMember]
public string ModuleB_Property2 { get; set; }
}
Und eine Singleton-Instanz der SessionVariables
Klasse wird verwendet, Session-Variablen zuzugreifen, wie folgt aus:
habe ich das speichern wie diese Arbeit:
using (FileStream writer = new FileStream(@"C:\test.txt", FileMode.Create))
{
DataContractSerializer dcs = new DataContractSerializer(typeof(SessionVariables), singletonSessionVariables.GetKnownTypes());
dcs.WriteObject(writer, singletonSessionVariables);
writer.Close();
}
Doch diese Methode funktioniert nicht, um die Klasse deserialisieren, weil ich nicht weiß, es Arten bekannt ist.
Kann ich generische Typen serialisieren und deserialisieren, wenn ich keine direkten Bibliotheksreferenzen für einen der verwendeten Typen habe? Und wenn ja, wie?
:/Ich würde den NetDataContractSerializer verwenden, der Typinformationen im Ergebnis enthält. – Will
Denken Sie nicht, dass es möglich ist: Wie werden wir eine Instanz eines Typs erstellen, wenn der Typ selbst unbekannt ist? – Tigran
@Will Danke, mir war nicht bewusst, dass es vorher schon existierte! Du solltest eine Antwort dafür schreiben :) – Rachel