Alm*_*lmo 3 .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();
Run Code Online (Sandbox Code Playgroud)
这似乎在我期望的文本文件中给出结果.
我尝试用这个来读它:
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);
Run Code Online (Sandbox Code Playgroud)
其中m_stream是以前打开的Stream对象.btlSerializer返回我期望的对象没有问题,但是m_stream.Position设置为文件的末尾,我无法读取下一个对象.我从命名空间中得到一个错误"Expecting element'root'..."
我做错了什么,或者我只是需要创建一个聚合对象来序列化包含两个对象?我检查了ReadObject上的MSDN文档,看看它对Stream对象的影响,但该页面上没有任何有价值的信息.
好吧,这很奇怪,但显然我只需要在每次调用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);
Run Code Online (Sandbox Code Playgroud)