在我们的游戏中,为了保存"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
。
一些推荐的替代方案是:
-
XmlSerializer
和DataContractSerializer
,用于将对象序列化/反序列化为 XML 和从 XML 反序列化; - XML 和 JSON 数据格式的
BinaryReader
和BinaryWriter
; -
System.Text.Json
API,用于将对象序列化/反序列化到内存中或从内存到 JSON 中。