将流或字节数组强制转换为对象



在我们的游戏中,为了保存"Ghost"(一个可序列化的类,记录某人如何玩一个关卡(,我们使用简单的

BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Open(filePath, FileMode.Open);
object ghost = bf.Deserialize(file);
file.Close();
return (Ghost)ghost;

这很完美,为了拯救幽灵,

BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Create(filePath);
bf.Serialize(file, ghost);
file.Close();

再次,完美。

问题是,我们也从网络加载东西(特别是Amazon S3(,最终给出了一个通用流。

我想做的是将该流保存到文件,

using( BinaryReader reader = new BinaryReader(stream) )
{
    FileStream file = File.Create(downloadPath);
    byte[] array = ReadAllBytes(reader);
    file.Write(array, 0, array.Length);
    file.Close();
}

但也将这些字节传递回请求代码,以便能够将它们转换为 Ghost 对象。 目前,我们保存了幽灵,告诉请求代码它已被保存,他们只是从那里再次读取它,这有效,但是当我们已经有可用的字节时,我 99% 确定这是一个不必要的步骤。

有点c#菜鸟,我看到的每个关于反序列化的例子都涉及File对象。 任何指示显然将不胜感激。

内存流的语义与文件流的工作方式相同。您拥有的示例应以相同的方式工作,内存流替换文件流。您也可以在不安全的代码中执行此操作,但对于您在此处尝试执行的操作而言,这似乎有些过分。这样的事情应该有效:

 var bf = new BinaryFormatter();
 object ghost = bf.Deserialize(stream);
 return ghost;

读者应该不需要,但我不知道你得到了什么样的流。

当然,一旦 Ghost 对象在内存中,就可以序列化副本到磁盘。

请注意,根据官方 .NET 文档:二进制格式化程序安全指南,应避免BinaryFormatter

一些推荐的替代方案是:

  • XmlSerializerDataContractSerializer,用于将对象序列化/反序列化为 XML 和从 XML 反序列化;
  • XML 和 JSON 数据格式的BinaryReaderBinaryWriter;
  • System.Text.Json API,用于将对象序列化/反序列化到内存中或从内存到 JSON 中。

相关内容

  • 没有找到相关文章

最新更新