当XMLserializer.serialize必须用空列表更新列表项时,它的行为如何
今天早上我遇到了一个xml错误,当我继续查找时,我发现一个xml如下所示:当XMLserializer.serialize必须用空列表更新列表项时,它的行为如何,xml,c#-4.0,xml-serialization,Xml,C# 4.0,Xml Serialization,今天早上我遇到了一个xml错误,当我继续查找时,我发现一个xml如下所示: <root> <list /> <root> var </item> <item> var </item> </list> </root> 我怀疑它试图用更新var,然后在第一个元素上卡住了,因为它立即关闭了它 有人知道在这个例子中序列化函数应该如何工作吗 编辑:我编写了一些代码来重新创建问题: using
<root>
<list />
<root> var </item>
<item> var </item>
</list>
</root>
我怀疑它试图用
更新var
,然后在第一个元素上卡住了,因为它立即关闭了它
有人知道在这个例子中序列化函数应该如何工作吗
编辑:我编写了一些代码来重新创建问题:
using System;
using System.Collections.Generic;
using System.IO;
namespace XMLserializetest
{
public class sample
{
public DateTime LastRun { get; set; }
public List<int> intlist { get; set; }
}
class Program
{
static void Main(string[] args)
{
const string FileName = "c:\\temp\\list.xml";
var file = new FileStream(FileName, FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite);
try
{
var test = new sample();
test.LastRun = DateTime.Now;
test.intlist = new List<int>();
/*Comment this line and run again, then look at the xml*/
test.intlist.Add(1); test.intlist.Add(2); test.intlist.Add(3); test.intlist.Add(4);
var x = new System.Xml.Serialization.XmlSerializer(test.GetType());
x.Serialize(file, test);
}
catch (Exception e)
{
var a = e;
}
finally
{
file.Close();
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
命名空间XMLserializetest
{
公共类样本
{
公共日期时间上次运行{get;set;}
公共列表intlist{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
常量字符串FileName=“c:\\temp\\list.xml”;
var file=newfilestream(文件名,FileMode.OpenOrCreate,System.IO.FileAccess.ReadWrite);
尝试
{
var测试=新样本();
test.LastRun=DateTime.Now;
test.intlist=新列表();
/*注释这一行并再次运行,然后查看xml*/
test.intlist.Add(1);test.intlist.Add(2);test.intlist.Add(3);test.intlist.Add(4);
var x=new System.Xml.Serialization.XmlSerializer(test.GetType());
x、 序列化(文件、测试);
}
捕获(例外e)
{
var a=e;
}
最后
{
file.Close();
}
}
}
}
我在加载流之前添加了这一行:
File.WriteAllText(FileName, string.Empty);
这会清空文件,因此serialize方法不会出现混乱,一切都很顺利。您应该使用StreamWriter,以便流知道他不需要追加:
var file = new StreamWriter(FileName);
对于本例,在编写之前,您应该首先检查文件是否存在。我暂时不排除我自己的答案。我相信一定有更干净的解决方案。
FileMode.Create
,也许?
var file = new StreamWriter(FileName);