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

时间:2014-01-02 13:02:22

标签: xml c#-4.0 xml-serialization

我今天早上有一个xml错误,当我去看时,我发现了一个看起来像这样的xml:

<root>   
  <list /> 
<root> var </item> 
<item> var </item> 
</list> 
</root>

这显然是错误的。

代码中唯一可以执行此操作的行如下:

XmlSerializer.Serialize(fileStream, thisObject);

我怀疑是它试图用<list><item>var</item></list>更新<list />,然后卡在第一个元素上,因为它会立即关闭它。

有没有人知道序列化函数在这个例子中应该如何表现?

编辑:我写了一些代码来重新创建问题:

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

        }
    }
}

2 个答案:

答案 0 :(得分:1)

您应该使用StreamWriter,以便流知道他不需要追加:

var file = new StreamWriter(FileName);

对于此示例,您应首先在写入之前检查文件是否存在。

答案 1 :(得分:0)

我在加载流之前添加了这一行:

File.WriteAllText(FileName, string.Empty);

这会清空文件,因此序列化方法中没有混淆,一切顺利。