C# 反序列化:类型转换错误(不同版本)
我有一个我序列化为文件的类,即.myfile01.myfile。我使用的是二进制序列化(不是xml) 在该类的版本1中,有一个字段“ColoredFont”。这是一个包含字体和颜色的类 在类的版本2中,类ColoredFont被更改,“Font”字段被“SerializableFont”替换 现在的问题是:当我想打开版本1文件时,我得到一个错误: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
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!!!!:-)