【问题标题】:Deserialization : type conversion error (different versions)反序列化:类型转换错误(不同版本)
【发布时间】:2011-10-18 11:50:19
【问题描述】:

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

在此类的版本 1 中,有一个字段“ColoredFont”。这是一个包含字体和颜色的类。

在该类的第 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 ??

【问题讨论】:

    标签: c# .net serialization deserialization


    【解决方案1】:

    试试这个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
    }
    

    【讨论】:

    • 是的,就是这样!我以前试过这个,但忘记了 : ISerializable 声明... :-) 谢谢,你是最棒的,+1000!!!! :-)
    【解决方案2】:

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

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

    【讨论】:

    • 我尝试使用 if (typeName == "System.Drawing.Font") { typeName = "Project.SerializableFont";但这给出了同样的错误:“System.Drawing.Font”类型的对象无法转换为“Project.SerializableFont”类型。
    • 但是 assemblyName 将始终是 System.Drawing,并且 typename 为“System.Drawing.Font”。我无法在 BindToType 方法中检查它属于哪个类?
    • 好的,经过几次尝试,我认为你需要更多的是在你的类上实现 ISerializable,这样你就可以为 SerializableFont 提供字体数据。你已经试过了吗?因为使用活页夹,您将用 SerializableFont 实例替换所有 Font 实例,这可能不是您想要实现的,是吗?
    • 我发布了另一个答案来详细说明我的最后评论。它在我的示例应用程序中有效,但我不确定它是否能重现您正在尝试做的事情。让我知道 ! :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多