Десериализация: ошибка преобразования типа (разные версии) - PullRequest
0 голосов
/ 18 октября 2011

У меня есть класс, который я сериализирую в файл, т.е.myfile01.myfile.Я использую двоичную сериализацию (не XML).

В версии 1 этого класса было поле 'ColoredFont'.Это класс, который содержит шрифт и цвет.

Во второй версии класса был изменен класс ColoredFont, а поле «Шрифт» заменено на «SerializableFont».

Теперь проблема: когда я хочу открыть файлы версии 1, Я получаю сообщение об ошибке:

 Object of type 'System.Drawing.Font' cannot be converted to 
 type 'Project.SerializableFont'.

Я уже использую пользовательский механизм связывания сериализации

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;
    }
}

Как я могу сказать десериализации преобразовать System.Drawing.Font в SerializableFont ??

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Попробуйте это для ColoredFont класса:

[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
}
1 голос
/ 18 октября 2011

Вы должны вернуть новый тип Project.SerializableFont при запросе typename ==System.Drawing.Font.

РЕДАКТИРОВАТЬ: Вы должны сравнивать Font и SerializableFont только так, как ожидается, что указанное имя типа будет именемкласс независимо от пространства имен, но я не уверен.Затем верните typeof(SerializableFont)

...