Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当XMLserializer.serialize必须用空列表更新列表项时,它的行为如何_Xml_C# 4.0_Xml Serialization - Fatal编程技术网

当XMLserializer.serialize必须用空列表更新列表项时,它的行为如何

当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

今天早上我遇到了一个xml错误,当我继续查找时,我发现一个xml如下所示:

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