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.

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top