DataContractJsonSerializer.ReadObject(Stream stream):我可以读取多个对象吗?

时间:2012-03-28 19:52:45

标签: .net deserialization

我正在使用.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'来自命名空间......”

我做错了什么,或者我只是需要创建一个包含两个对象的序列化聚合对象?我检查了ReadObject上的MSDN文档,看看它对Stream对象的影响,但该页面上没有任何有价值的信息。

2 个答案:

答案 0 :(得分:6)

好的,这很奇怪,但显然我只需要在每次调用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);

答案 1 :(得分:0)

我的问题是因为我使用的是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);
}