C# - 二进制序列化InvalidCastException

时间:2017-01-07 15:47:39

标签: c# serialization binary-serialization

所以我有一个名为OutputInformation的类,我想存储然后在另一台计算机上读取以检索数据。

我正在使用二进制序列化。

[Serializable()]
public class OutputInformation
{
    public List<string> filenames { get; set; }
    public long[] filesizes { get; set; }
}

public void Write()
{
    OutputInformation V = new OutputInformation();
    V.filesizes = sizearray;
    V.filenames = namelist;
    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream("D:\\MyFile.bin", FileMode.Create, 
                         FileAccess.Write, FileShare.None);
    formatter.Serialize(stream, V);
    stream.Close();
}

序列化在用户控件中完成,如果我在用户控件中反序列化,它可以正常工作。

但是如果我尝试从主窗口反序列化,我会得到一个invalidcastexception。所以我想如果我试图从另一台计算机反序列化文件,就会出现同样的问题。

我该如何解决这个问题?我只需要将类存储在一个文件中,稍后从另一台计算机中检索它。最好不要使用XML序列化。

[Serializable()]
public class OutputInformation
{
    public List<string> filenames { get; set; }
    public long[] filesizes { get; set; }
}

IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("D:\\MyFile.bin", FileMode.Open, 
                                          FileAccess.Read, FileShare.Read);
OutputInformation obj = (OutputInformation)formatter.Deserialize(stream);
stream.Close();

错误是InvalidCastException。附加信息:[A] OutputInformation不能转换为[B] OutputInformation。

1 个答案:

答案 0 :(得分:2)

这两个类应该在同一个名称空间中。在反序列化中定义您的OutputInformation类与序列化完全相同的名称空间(或使用它引用程序集)。

或者,如果不可能,或者您不想这样做,您应该编写自己的SerializationBinder

实现
public class ClassOneToNumberOneBinder : SerializationBinder
{
    public override Type BindToType(string assemblyName, string typeName)
    {
        typeName = typeName.Replace(
            "oldNamespace.OutputInformation",
            "newNamespace.OutputInformation");

        return Type.GetType(typeName);
    }
}

在反序列化之前设置它:

formatter.Binder = new ClassOneToNumberOneBinder();

点击此处了解更多详情:Is it possible to recover an object serialized via "BinaryFormatter" after changing class names?