XMLSerialize一个ObservableCollection

我在observable集合的xml序列化中遇到问题。

这是我序列化的内容:

public enum Status { Pending, Active, Completed, Cancelled } public abstract class Entity : INotifyPropertyChanged { ... } public class UserStory : Entity { public uint StoryID { get; set; } public Status Status { get; set; } ... public ObservableCollection Tasks { get; set; } } public class Task : Entity { public uint TaskID { get; set; } ... } 

这是我如何序列化它:

 public static void SerializeObjectToXML(T item, string FilePath) { XmlSerializer xs = new XmlSerializer(typeof(T)); using (StreamWriter wr = new StreamWriter(FilePath)) { xs.Serialize(wr, item); } } public class Main() { ObservableCollection UserStories { get; set; } void Main() { ... ObservableCollection Document = new ObservableCollection(); Document.Add(UserStories); SerializeObjectToXML<ObservableCollection>(Document , "..."); ... } } 

但是xs.Serialize(wr, item);发生错误xs.Serialize(wr, item); 一行说:

InvalidOperationexception :生成XML文档时出错。 内部exception :ScrumPresentor.ObservableCollection`1 [[ScrumPresentor.UserStory,ScrumPresentor,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]类型可能不会在此上下文中使用。

我在.NET 4.0中使用Visual Studio 2010,WPF应用程序。

尝试使用System.Xml.Serialization.XmlInclude属性。 我不确定我是否正确理解了你收集的集合的意图,但假设这是你想要的,这是一个有效的解决方案。 输出遵循以下代码:

 using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.IO; using System.Xml.Serialization; namespace StackoverflowXxmlSerialize { public enum Status { Pending, Active, Completed, Cancelled } [System.Xml.Serialization.XmlInclude(typeof(UserStory))] [System.Xml.Serialization.XmlInclude(typeof(Task))] public abstract class Entity : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; } public class UserStory : Entity { public uint StoryID { get; set; } public Status Status { get; set; } public ObservableCollection Tasks { get; set; } } public class Task : Entity { public uint TaskID { get; set; } } class Util { public static void SerializeObjectToXML(T item, string FilePath) { XmlSerializer xs = new XmlSerializer(typeof(T)); using (StreamWriter wr = new StreamWriter(FilePath)) { xs.Serialize(wr, item); } } } public class TestSerialize { static ObservableCollection UserStories { get; set; } public static void RunTest() { UserStories = new ObservableCollection { new UserStory { StoryID = 127, Status = Status.Active, Tasks = new ObservableCollection{new Task { TaskID = 11 }, new Task { TaskID = 12 }} }, new UserStory { StoryID = 128, Status = Status.Cancelled, Tasks = new ObservableCollection{new Task { TaskID = 13 }, new Task { TaskID = 14 }} }, new UserStory { StoryID = 129, Status = Status.Completed, Tasks = new ObservableCollection{new Task { TaskID = 9 }, new Task { TaskID = 10 }} }, }; ObservableCollection> Document = new ObservableCollection>(); Document.Add(UserStories); Util.SerializeObjectToXML>>(Document, @"d:\tmp\junk.txt"); } } } 

上面的代码生成了这个文本文件:

     127 Active   11   12     128 Cancelled   13   14     129 Completed   9   10