将流或字节数组转换为对象
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 官方文档应避免使用 BinaryFormatter
:BinaryFormatter security guide。
一些推荐的备选方案是:
XmlSerializer
和 DataContractSerializer
对于 serializing/deserializing 个对象进出 XML;
BinaryReader
和 BinaryWriter
用于 XML 和 JSON 数据格式;
System.Text.Json
API 用于 serializing/deserializing 对象进出内存 JSON。
在我们的游戏中,为了保存一个 "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 官方文档应避免使用 BinaryFormatter
:BinaryFormatter security guide。
一些推荐的备选方案是:
XmlSerializer
和DataContractSerializer
对于 serializing/deserializing 个对象进出 XML;BinaryReader
和BinaryWriter
用于 XML 和 JSON 数据格式;System.Text.Json
API 用于 serializing/deserializing 对象进出内存 JSON。