Ho una lista di tipi che ho bisogno di salvare su file e leggerla dopo. Io uso DataContractSerializer
ma ottengo un'eccezione durante la deserializzazione:Serialize/deserialize System.RuntimeType
Non riesci a trovare costruttore con argomenti (SerializationInfo, StreamingContext) in ISerializable "System.RuntimeType".
Ho aggiunto System.RuntimeType
come un tipo noto al mio serializzatore, ma non è stato d'aiuto.
Ecco il codice dei miei due metodi
public static void SaveTypes(List<Type> types, string fileName)
{
Type rt = types[0].GetType();
List<Type> knownTypes = new List<Type>() { rt }; //I get a List with System.RuntimeType item here
DataContractSerializer serializer = new DataContractSerializer(typeof(List<Type>), knownTypes);
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
Stream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write);
using (XmlWriter xw = XmlWriter.Create(fs, settings))
serializer.WriteObject(xw, types);
}
serializzazione sembra funzionare bene, e il file di output è ok, ma il problema inizia il deserializzazione:
public static object LoadTypes(string fileName)
{
Stream file = new FileStream(fileName, FileMode.Open, FileAccess.Read);
byte[] data = new byte[file.Length];
file.Read(data, 0, (int)file.Length);
Type rt = file.GetType();
List<Type> knownTypes = new List<Type>() { rt.GetType() };
DataContractSerializer deserializer = new DataContractSerializer(typeof(List<Type>), knownTypes);
Stream stream = new MemoryStream();
stream.Write(data, 0, data.Length);
stream.Position = 0;
return deserializer.ReadObject(stream); //exception here
}
Esiste un modo per passare attraverso Questo? O forse c'è un altro modo per memorizzare i tipi?
Si dovrebbe serializzare i ** dati **, non l'implementazione. Un 'Tipo' è al 100% sull'implementazione. Francamente, è semplicemente la strada sbagliata, e sarebbe un disservizio aiutarti ad andare più in là lungo quel sentiero oscuro. IMO. –
Realizzo i dati in serie, ma contiene tipi definiti dall'utente a cui non riesco ad accedere. Quindi quando li deserializzo ho bisogno di sapere che tipi. Pensavo che l'unico modo per accedervi fosse archiviarli in un file. –