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

San*_*osh 4 c# serialization datacontractserializer

如何使用 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();
    }
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ell 5

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

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