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

cast a stream or byte array to object

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

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();

再一次,完美。

事实是,我们也在从 Web 加载内容(特别是 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;

应该不需要reader,但是不知道你的是什么流

当然,一旦你在内存中有了 ghost 对象,就将一个副本序列化到磁盘。

请注意,根据 .NET 官方文档应避免使用 BinaryFormatterBinaryFormatter security guide

一些推荐的备选方案是:

  • XmlSerializerDataContractSerializer 对于 serializing/deserializing 个对象进出 XML;
  • BinaryReaderBinaryWriter 用于 XML 和 JSON 数据格式;
  • System.Text.Json API 用于 serializing/deserializing 对象进出内存 JSON。