Deserialización: error de conversión de tipo (diferentes versiones)
-
25-10-2019 - |
Pregunta
Tengo una clase que serializo en un archivo, es decir. myFile01.myfile. Estoy usando serialización binaria (no XML).
En la versión 1 de esta clase, había un campo 'ColoredFont'. Esta es una clase que contiene una fuente y un color.
En la versión 2 de la clase, se cambió la clase ColoredFont, y el campo 'Font' fue reemplazado por 'SerializableFont'.
Ahora el problema: cuando quiero abrir archivos de la versión 1, recibo un error:
Object of type 'System.Drawing.Font' cannot be converted to
type 'Project.SerializableFont'.
Ya uso una carpeta de serialización personalizada
public class Binder : SerializationBinder {
public override Type BindToType(string assemblyName, string typeName) {
Type tyType = null;
string sShortAssemblyName = assemblyName.Split(',')[0];
Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
if (sShortAssemblyName.ToLower() == "project"
|| sShortAssemblyName == "SoftwareV_3.0" )
{
sShortAssemblyName = "SoftwareV_4.0";
}
foreach (Assembly ayAssembly in ayAssemblies) {
if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0]) {
tyType = ayAssembly.GetType(typeName);
break;
}
}
return tyType;
}
}
¿Cómo puedo decir la deserialización para convertir el sistema.
Solución
Prueba esto para el ColoredFont
clase :
[Serializable]
public class ColoredFont : ISerializable
{
public SerializableFont SerializableFont;
public Color Color;
private ColoredFont(SerializationInfo info, StreamingContext context)
{
Color = (Color)info.GetValue("Color", typeof(Color));
try
{
SerializableFont = (SerializableFont)info.GetValue("SerializableFont", typeof(SerializableFont));
}
catch (SerializationException serEx)
{
Font f = (Font)info.GetValue("Font", typeof(Font));
// do something to initialize SerializedFont from 'f'
}
}
#region ISerializable Members
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("SerializableFont", SerializableFont);
info.AddValue("Color", Color);
}
#endregion
}
Otros consejos
Debes devolver el nuevo tipo Project.SerializableFont
Cuando se le pidió typename ==System.Drawing.Font
.
Editar: debes comparar Font
y SerializableFont
Solo como se espera que el nombre de tipo dado sea el nombre de la clase, independientemente del espacio de nombres, pero no estoy seguro. Luego regresar typeof(SerializableFont)