2012-03-28 39 views
3

我与.NET 4.0的工作,2010年VSDataContractJsonSerializer.ReadObject(Stream stream):我可以读取多个对象吗?

我写这样的文件:

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被设置为文件的结尾,并且我无法读取下一个对象。我得到一个错误“从命名空间预期元素'根'...”

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

回答

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); 
+0

我觉得很奇怪这不是任何地方JsonSerializer文档提及。 – Almo 2012-03-28 20:43:01

+1

我也不知道为什么头寸必须重置为零。谢谢。 – codingbiz 2015-04-12 03:16:11

+0

该位置需要重置为零,因为从您刚刚写入的流中读取将从其当前位置开始,而不是从头开始。这是与读取/写入流的框架中的其他方法一致的行为。 – 2015-05-13 01:16:46

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); 
} 
相关问题