我有一个类我序列化到一个文件,即。 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?
答案 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
。
编辑:
您必须仅比较Font
和SerializableFont
,因为无论命名空间如何,预期给定的typename都是类的名称,但我不确定。然后返回typeof(SerializableFont)