反序列化:类型转换错误(不同版本)

时间:2011-10-18 11:50:19

标签: c# .net serialization deserialization

我有一个类我序列化到一个文件,即。 myfile01.myfile。我正在使用二进制序列化(而不是xml)。

在本课程的第1版中,有一个字段'ColoredFont'。这是一个包含Font和Color的类。

在该类的第2版中,更改了ColoredFont类,并且'Font'字段被'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 个答案:

答案 0 :(得分:2)

试试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 :(得分:1)

当被要求Project.SerializableFont时,您必须返回新类型typename ==System.Drawing.Font

编辑: 您必须仅比较FontSerializableFont,因为无论命名空间如何,预期给定的typename都是类的名称,但我不确定。然后返回typeof(SerializableFont)