gpt4 book ai didi

c# - 使用 DataContractSerializer 序列化和反序列化多个对象

转载 作者:行者123 更新时间:2023-11-30 22:34:25 25 4
gpt4 key购买 nike

如何使用 DataContractSerializer 序列化和反序列化多个对象?序列化没问题,但是在反序列化过程中出现错误

“序列化操作失败。原因:反序列化 Serialization.Person 类型的对象时出错。有多个根元素。”

错误消息清楚地提到序列化文档没有根元素。但是我该如何克服呢?

代码如下:

[DataContract]
class Person {
[DataMember(Name = "CustName")]
internal string Name;
public Person(string n) {Name = n;}
}

class Program {
public static void Main() {
WriteObject("d:\\temp\\DataContractExample.xml" , "Mary");
WriteObject("d:\\temp\\DataContractExample.xml", "Joe");
ReadObject("d:\\temp\\DataContractExample.xml");
}

public static void WriteObject(string path, string name) {
Person p1 = new Person(name);
FileStream fs = new FileStream(path, FileMode.Append);
XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs);
DataContractSerializer ser = new DataContractSerializer(typeof(Person));
ser.WriteObject(writer, p1);

writer.Close();
fs.Close();
}
public static void ReadObject(string path) {
FileStream fs = new FileStream(path, FileMode.OpenOrCreate);
XmlDictionaryReader reader =
XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());

DataContractSerializer ser = new DataContractSerializer(typeof(Person));

// Deserialize the data and read it from the instance.
Person[] newPerson = (Person[])ser.ReadObject(reader);
Console.WriteLine("Reading this object:");
Console.WriteLine(String.Format("{0}", newPerson[0].Name));
fs.Close();
}

当我从 DataContractSerializer ser.ReadObject(reader) 中读取时,我得到了上面提到的异常。是否可以在使用 DataContractSerializer 存储多个对象时创建根元素?

最佳答案

DataContractSerializer适用于 xml 文档,因此需要一个顶级元素。最简单的方法是序列化 List<Person> ,应该避免这种情况。您也可以手动添加外部元素,也许使用 XmlReaderReadSubtree在序列化期间(尽管注意:这是一项丑陋的艰苦工作)。

不过,最简单的选择是简单地序列化一个 List<Person>从一开始,反序列化为 List<Person> - 这将是一个单个 xml block ,因此不会扰乱反序列化器。

关于c# - 使用 DataContractSerializer 序列化和反序列化多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7835360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com