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

时间:2015-02-09 18:30:07

标签: c# unity3d stream bytearray deserialization

在我们的游戏中,要保存一个" 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();

再次,完美。

事情是,我们也在网上加载东西(特别是亚马逊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#noob,我见过的关于反序列化的每个例子都涉及File个对象。任何指针显然都会受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

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

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

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

当然,在内存中有ghost对象后,将副本序列化为磁盘。