2012-03-28 72 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); 
}