【问题标题】:Weird XmlSerializer behaviour on serializing List after removing element from it [duplicate]从列表中删除元素后序列化列表的奇怪XmlSerializer行为[重复]
【发布时间】:2017-03-26 12:57:51
【问题描述】:
public class Person {
    [XmlElement]
    public int Id { get; set; }
    [XmlElement]
    public string Name { get; set; }
}
//=========
XmlSerializer formatter = new XmlSerializer(typeof(List<Person>));

        List<Person> personList = new List<Person>();
        personList.Add(new Person { Id = 5, Name = "Bob" });
        personList.Add(new Person { Id = 15, Name = "Tom" });
        Person kate = new Person { Id = 115, Name = "Kate" };
        personList.Add(kate);

        string filePath = @"C:\DELEteME.xml";

        using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate)) {
            formatter.Serialize(fs, personList);
        }

到目前为止一切正常:

<?xml version="1.0"?>
<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Person>
    <Id>5</Id>
    <Name>Bob</Name>
  </Person>
  <Person>
    <Id>15</Id>
    <Name>Tom</Name>
  </Person>
  <Person>
    <Id>115</Id>
    <Name>Kate</Name>
  </Person>
</ArrayOfPerson>

但是在我从 personList 中删除一个元素并尝试再次序列化它之后

        personList.Remove(kate);
        using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate)) {
            formatter.Serialize(fs, personList);
        }   

它序列化到这个:

<?xml version="1.0"?>
<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Person>
    <Id>5</Id>
    <Name>Bob</Name>
  </Person>
  <Person>
    <Id>15</Id>
    <Name>Tom</Name>
  </Person>
</ArrayOfPerson><Id>115</Id>
    <Name>Kate</Name>
  </Person>
</ArrayOfPerson>

它只是删除了&lt;Person&gt;,当然,由于多个命名空间,我不能再使用文件了。 无法弄清楚为什么会发生这种情况以及如何解决这个问题。谢谢

【问题讨论】:

    标签: c# .net xml-serialization xmlserializer


    【解决方案1】:

    使用FileMode.Create 而不是FileMode.OpenOrCreate。来自the docs

    FileMode.Create相当于请求如果文件不存在就使用CreateNew;否则,使用截断

    基本上,如果文件存在,使用OpenOrCreate 将不会截断文件(将其大小设置为 0 字节)。如果您正在编写的内容小于现有文件大小,那么您会在“未使用”部分看到垃圾。

    【讨论】:

    • 谢谢。这可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多