从列表中删除元素后序列化列表时出现奇怪的 XmlSerializer 行为
Weird XmlSerializer behaviour on serializing List after removing element from it
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>
它只是删除了 <Person>
,当然我不能再使用一个文件了,因为有多个命名空间。
无法弄清楚为什么会发生这种情况以及如何解决这个问题。谢谢
使用 FileMode.Create
而不是 FileMode.OpenOrCreate
。来自 the docs:
FileMode.Create is equivalent to requesting that if the file does not exist, use CreateNew; otherwise, use Truncate
本质上,如果文件存在,使用 OpenOrCreate
将不会截断文件(将其大小设置为 0 字节)。如果您正在编写的内容小于现有文件大小,那么您将在 'unused' 部分看到垃圾。
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>
它只是删除了 <Person>
,当然我不能再使用一个文件了,因为有多个命名空间。
无法弄清楚为什么会发生这种情况以及如何解决这个问题。谢谢
使用 FileMode.Create
而不是 FileMode.OpenOrCreate
。来自 the docs:
FileMode.Create is equivalent to requesting that if the file does not exist, use CreateNew; otherwise, use Truncate
本质上,如果文件存在,使用 OpenOrCreate
将不会截断文件(将其大小设置为 0 字节)。如果您正在编写的内容小于现有文件大小,那么您将在 'unused' 部分看到垃圾。