2013-01-31 55 views
1

我有一个包含A类对象列表的A类和B类。Windows Phone 8 - 序列化/反序列化XML时出错

public class Item 
{ 
    public string X{ get; set; } 
    public string Y{ get; set; } 
} 
public class ItemCollection 
{ 
    List<Item> items = new List<Item>(); 
    //Some methods 
} 

我可以通过序列化:

IsolatedStorageFileStream ifs = new IsolatedStorageFileStream("myxml.xml", FileMode.Create, isfile); 
DataContractSerializer ser = new DataContractSerializer(itemlist.items.GetType()); 
XmlWriter writer = XmlWriter.Create(ifs); 
ser.WriteObject(writer, itemlist.items); 

但反序列化它,我得到 “......缺少根元素。”错误。

IsolatedStorageFileStream ifs = new IsolatedStorageFileStream("myxml.xml", FileMode.Open, isfile); 
DataContractSerializer ser = new DataContractSerializer(itemlist.Items.GetType()); 
XmlReader reader=XmlReader.Create(ifs); 
itemlist.items= (List<Item>)ser.ReadObject(reader); 

是否有任何其他/更好的方式序列化/反序列化一个类包含另一个类的列表/集合?

+2

那么,实际的文件内容是什么? *是*缺失的根元素?这可能与你没有正确处理/关闭的东西的数量有关吗?您是否尝试添加'reader.MoveToContent()'? –

+0

我正在写项目清单并阅读它们(文件被覆盖)。我得到“根元素缺失”。与reader.MoveToContent()也一样。 – aaa

回答

1

它看起来像我这样的问题很简单,你是擦除该文件,当你打开它来反序列化,通过FileMode.Create。所以当然根元素丢失:它是空的。您可能在序列化/反序列化之间反转了FileMode.CreateFileMode.Open。然后添加几个using为好措施。

序列化应使用FileMode.Create截断或为新数据创建新文件。

反序列化应该使用FileMode.Open来查看现有数据。

+0

对不起,这是复制粘贴错误。在实际代码中,FileMode在反序列化时处于打开状态,而在序列化时处于创建状态。我在问题中纠正了它。 – aaa

+0

@aaa再次:文件内容是什么? –

+0

我正在序列化Itemcollection类。序列化正在成功完成。但是,反序列化时,我收到错误。所以我不知道该文件包含什么。我如何检查文件内容? – aaa