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

4
如何使用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存储多个对象时,是否可以创建根元素?


如果存储格式可以更改,那么请注意,有些格式是安全可追加的;如果您对使用不同数据格式(但有效)的类似示例感兴趣,请告诉我。 - Marc Gravell
请注意 - 您正在单独编写两个Person实例,并尝试反序列化一个Person[] - 但它具有非常不同的布局。 - Marc Gravell
是的,马克!你提到了哪些其他存储格式?任何指针都会对我有所帮助。我正在为工作流层次结构创建一个存储解决方案。因此,我需要动态地附加、修改和删除元素。 - Santhosh
注意:如果您一开始就可以序列化List<Person>,那么这可能不是一个问题(即它将与DataContractSerializer一起工作)。 - Marc Gravell
将 List<Person> 序列化为列表也完全没问题!! - Santhosh
显示剩余5条评论
1个回答

5
DataContractSerializer适用于xml文档,因此需要一个顶层元素。最简单的方法是序列化一个List,以避免这种情况。您还可以手动添加外部元素,可能在序列化期间使用XmlReader和ReadSubtree(但请注意:这很丑陋且需要大量工作)。不过,最简单的方法是从一开始就将List序列化,然后反序列化为List - 这样将得到一个单一的xml块,因此不会使反序列化程序出错。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接