Hallo,
ich hab hier ein Projekt von nem ehemaligen Kollegen umgestellt, ein Member ist jetzt kein Dictionary<string, List<string>> mehr, sondern ein Dictionary<string, HybridSet<string>>
HybridSet<> ist eine Klasse von mir.
Nun kann man die Klasse mit eben diesem Member auch serialisieren.
Problem nun: es gibt eben alte Serialisiereungen, die sich natürlich mit der neuen Definition beißen:
Object of type 'System.Collections.Generic.Dictionary
2[System.String,System.Collections.Generic.List
1[System.String]]' cannot be converted to type 'System.Collections.Generic.Dictionary2[System.String,Collections.Generic.HybridSet
1[System.String]]'.
kann ich das irgendwie mit einem Typconverter lösen?
nachtrag: ich hab schon mit operatoren überladungen rumprobiert, aber es scheint es nicht zu tun.
wie sooft geb ich mir die antwort selbst:
Haber System.Runtime.Serialization.SerializationBinder gefunden (siehe Overriding Assembly / Type information auf http://www.diranieh.com/NETSerialization/BinarySerialization.htm#Advanced%20Serialization)
Denke mal, das wird mir weiter Helfen.
hmm, so ganz einfach ist es nun doch nicht
hab jetzt folgendes
public class TabModelPersistenceHelperBinder : System.Runtime.Serialization.SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
Type retval = Type.GetType(String.Format("{0}, {1}", typeName, assemblyName));
if(retval.Equals(typeof(Dictionary<string, List<string>>)))
retval = typeof(Dictionary<string, HybridSet<string>>);
return retval;
}
}
werde auch auf gerufen, jedoch wird jetzt die Exception geworden, dass IConvertible implementiert werden muss.
Leider kann ich ja Dictionary<string, List<string>> nicht mehr von Iconvertible ableiten.
Gibts noch andere ideen?
ah, man muss doch noch bissle mehr tun
public class TabModelPersistenceHelperBinder : System.Runtime.Serialization.SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
Type retval = Type.GetType(String.Format("{0}, {1}", typeName, assemblyName));
if(retval.Equals(typeof(Dictionary<string, List<string>>)))
retval = typeof(Dictionary<string, HybridSet<string>>);
else if(retval.Equals(typeof(KeyValuePair<string, List<string>>)))
retval = typeof(KeyValuePair<string, HybridSet<string>>);
else if (retval.Equals(typeof(List<string>)))
retval = typeof(HybridSet<string>);
return retval;
}
}