我正在使用.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对象的影响,但该页面上没有任何有价值的信息。
答案 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);
}