Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化:类型转换错误(不同版本)_C#_.net_Serialization_Deserialization - Fatal编程技术网

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

C# 反序列化:类型转换错误(不同版本),c#,.net,serialization,deserialization,C#,.net,Serialization,Deserialization,我有一个我序列化为文件的类,即.myfile01.myfile。我使用的是二进制序列化(不是xml) 在该类的版本1中,有一个字段“ColoredFont”。这是一个包含字体和颜色的类 在类的版本2中,类ColoredFont被更改,“Font”字段被“SerializableFont”替换 现在的问题是:当我想打开版本1文件时,我得到一个错误: Object of type 'System.Drawing.Font' cannot be converted to type 'Projec

我有一个我序列化为文件的类,即.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???

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

编辑:
您必须比较
Font
SerializableFont
,因为不管名称空间如何,给定的typename都应该是类的名称,但我不确定。然后返回
typeof(SerializableFont)
当要求
typename==System.Drawing.Font
时,必须返回新类型的
Project.SerializableFont

编辑:
您必须比较
Font
SerializableFont
,因为不管名称空间如何,给定的typename都应该是类的名称,但我不确定。然后返回
typeof(SerializableFont)
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
}

对于
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
}

我尝试使用if(typeName==“System.Drawing.Font”){typeName=“Project.SerializableFont”;}进行此操作,但出现了相同的错误:“System.Drawing.Font”类型的对象无法转换为“Project.SerializableFont”类型。但是assemblyName将始终是System.Drawing,typeName“System.Drawing.Font”。我无法在BindToType方法中检查它属于哪个类?好的,经过几次尝试后,我认为您需要更多的是在类上实现ISerializable,以便可以向SerializableFont提供字体数据。你已经试过这个了吗?因为使用活页夹,您将用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实例替换所有字体实例,这可能不是您想要实现的,是吗?我发布了另一个答案来详细阐述我的上一个评论。它在我的示例应用程序中起了作用,但我不确定它是否重现了您试图执行的操作。让我知道!:-)是的,就是这样!我以前尝试过这个,但忘记了:ISerializable语句…:-)谢谢,你是最棒的,+1000!!!!:-)是的,就是这样!我以前尝试过这个,但忘记了:ISerializable语句…:-)谢谢,你是最棒的,+1000!!!!:-)