gpt4 book ai didi

C# - 二进制序列化 InvalidCastException

转载 作者:行者123 更新时间:2023-11-30 23:17:17 25 4
gpt4 key购买 nike

所以我有一个名为 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。

最佳答案

这两个类应该在同一个命名空间中。在与序列化完全相同的命名空间中定义反序列化的 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?

关于C# - 二进制序列化 InvalidCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41523222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com