簡體   English   中英

將 stream 或字節數組轉換為 object

[英]cast a stream or byte array to object

在我們的游戲中,為了保存一個“幽靈”(一個可序列化的 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)加載內容,最后給出一個通用的 stream。

我想做的是將 stream 保存到文件中,

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

但也將這些字節返回給請求代碼,以便能夠將它們投射到 Ghost object 中。目前,我們保存了 ghost,告訴請求代碼它已被保存,他們只是從那里再次讀取它,這是有效的,但是當我們已經有了可用的字節時,我可以 99% 確定這是一個不必要的步驟。

小白c#,我看到的每一個反序列化的例子都涉及到File對象。 任何指針顯然將不勝感激。

內存流的語義與文件流的語義相同。 您擁有的示例應以相同的方式工作,內存流代替文件流。 您也可以使用不安全的代碼來執行此操作,但是對於您在此處嘗試執行的操作來說,這似乎有些過頭。 這樣的事情應該起作用:

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

讀者不需要,但我不知道您得到什么樣的信息。

當然,一旦您在內存中有了幽靈對象,就可以將副本序列化到磁盤上。

請注意,根據官方 .NET 文檔,應避免使用BinaryFormatterBinaryFormatter 安全指南

一些推薦的替代方案是:

  • XmlSerializerDataContractSerializer用於將對象序列化/反序列化為 XML;
  • XML和JSON數據格式的BinaryReaderBinaryWriter
  • System.Text.Json用於將對象序列化/反序列化為 memory 到 JSON 的 API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM