2015-02-09 3 views
0

В нашей игре, чтобы сохранить «Призрак» (сериализуемая класс, который является запись о том, как кто-то играл уровень), мы используем простойотливать поток или массив байтов объекта

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

Но и доставить эти байты обратно запрашивающей код, чтобы иметь возможность бросить их в объект Духа. В настоящее время мы сохраняем призрак, говорим, что запрашивающий код он был сохранен, и они просто читают его снова, что работает, но я был бы на 99% уверен, что это лишний шаг, когда у нас уже есть байты, доступные нам.

Немного C# noob, и каждый пример, который я видел о десериализации, включает File объектов. Разумеется, любые указатели были бы весьма благодарны.

+1

Если у вас уже есть сериализованный массив байтов, тогда просто создайте MemoryStream и используйте BinaryFormatter для десериализации оттуда. – RogerN

+0

Мне на самом деле не нужно. «Поток», который уже существует, уже совместим, и BinaryFormatter может принять это, как @CCondron ответил ниже. – seaders

ответ

2

Семантика потока памяти работает так же, как файловый поток. Приведенные вами примеры должны работать одинаково с потоком памяти, заменяющим поток файлов. Вы также можете сделать это в небезопасном коде, но это кажется излишним для того, что вы пытаетесь сделать здесь. Что-то, как это должно работать:

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

Там не должно быть никакой необходимости для читателя, но я не знаю, какой поток ваш получать.

и, разумеется, если у вас есть объект-призрак в памяти, сериализуйте копию на диск.

+0

Не могу поверить, что я пропустил это. Я был на странице API «BinaryFormatter» и все, но полностью пропустил вариант потока для десериализации. Это переход от Eclipse. Я думаю, что это повлияло на меня больше, я бы проверил каждый из его кодовых подсказок, ковыряясь в определении класса, если бы использовал это. Хорошо, когда-нибудь мне будет комфортно в MonoDevelop! Спасибо @CCondron. – seaders

Смежные вопросы