2011-10-20 53 views
2

如何使用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(); 
    } 

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

+0

但是,如果可以更改存储格式,请注意某些格式是安全可附加的;请告诉我,如果您可能对使用不同数据格式的类似示例感兴趣(但有效) –

+0

另请注意,您正在*写*(分开)两个Person类实例,并试图反序列化一个Person [] [ - 但这有一个非常不同的布局 –

+0

是的马克!你在谈论什么其他存储格式。任何指针都会帮助我。我正在为工作流程层次结构创建存储解决方案。所以我需要动态追加,修改和删除元素。 – Santhosh

回答

3

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

最简单的选择,虽然是简单的序列化从一开始就List<Person>,和反序列化作为List<Person> - 那么这将是一个 XML猛男,所以不会打乱解串器。