DataContractJsonSerializer.ReadObject (Stream stream): могу ли я прочитать более одного объекта? - PullRequest
3 голосов
/ 28 марта 2012

Я работаю с .NET 4.0, VS 2010.

Я пишу файл, подобный этому:

DataContractJsonSerializer btlSerializer = new DataContractJsonSerializer(typeof(BrainTrackList));
FileStream fs = File.OpenWrite(m_fileName);
btlSerializer.WriteObject(fs, trackList);

DataContractJsonSerializer npcemSerializer = new DataContractJsonSerializer(typeof(NPCExistsModelData));
npcemSerializer.WriteObject(fs, npcemData);

fs.Close();
fs.Dispose();

, который дает результат в текстовом файле, который я ожидаю.

Я пытаюсь прочитать это так:

DataContractJsonSerializer btlSerializer = new DataContractJsonSerializer(typeof(BrainTrackList));
BrainTrackList listContainer = (BrainTrackList)btlSerializer.ReadObject(m_stream);

DataContractJsonSerializer npcemSerializer = new DataContractJsonSerializer(typeof(NPCExistsModelData));
NPCExistsModelData npceDataContainer = (NPCExistsModelData)npcemSerializer.ReadObject(m_stream);

, где m_stream - это ранее открытый объект Stream.BtlSerializer возвращает ожидаемый объект без проблем, но затем m_stream.Position устанавливается в конец файла, и я не могу прочитать следующий объект.Я получаю сообщение об ошибке «Ожидается элемент root из пространства имен ...»

Я делаю что-то не так или мне просто нужно создать агрегатный объект для сериализации, который содержит оба объекта?Я проверил документацию MSDN по ReadObject, чтобы увидеть, что он говорит о его влиянии на объект Stream, но на этой странице нет никакой информации о нем.

Ответы [ 2 ]

6 голосов
/ 29 марта 2012

Хорошо, это странно, но, очевидно, мне просто нужно установить позицию потока в начало перед каждым вызовом ReadObject.Он достаточно умен, чтобы игнорировать все в файле, кроме типа объекта, который я пытаюсь прочитать.

Так что это работает:

DataContractJsonSerializer btlSerializer = new DataContractJsonSerializer(typeof(BrainTrackList));
BrainTrackList listContainer = (BrainTrackList)btlSerializer.ReadObject(m_stream);

m_stream.Position = 0;

DataContractJsonSerializer npcemSerializer = new DataContractJsonSerializer(typeof(NPCExistsModelData));
NPCExistsModelData npceDataContainer = (NPCExistsModelData)npcemSerializer.ReadObject(m_stream);
0 голосов
/ 14 декабря 2015

Моя проблема заключалась в том, что я использовал объект StreamWriter, и его нужно было очистить.

var ser = new DataContractJsonSerializer(typeof(Control[]));
using (var stream = new MemoryStream())
{
    var sw = new StreamWriter(stream);
    sw.Write(data);

sw.Flush ();

    stream.Position = 0;
    var pfControls = (Control[])ser.ReadObject(stream);
}
...