2011-12-26 63 views
5

我在觀察集合的xml序列化中遇到問題。XMLSerialize一個ObservableCollection

這裏就是我連載:

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<Task> Tasks { get; set; } 
} 

public class Task : Entity 
{ 
    public uint TaskID { get; set; } 
    ... 
} 

這是我如何序列化:

public static void SerializeObjectToXML<T>(T item, string FilePath) 
{ 
    XmlSerializer xs = new XmlSerializer(typeof(T)); 
    using (StreamWriter wr = new StreamWriter(FilePath)) 
    { 
     xs.Serialize(wr, item); 
    } 
} 

public class Main() 
{ 
    ObservableCollection<UserStory> UserStories { get; set; } 

    void Main() 
    { 
     ... 
     ObservableCollection<object> Document = new ObservableCollection<object>(); 
     Document.Add(UserStories); 
     SerializeObjectToXML<ObservableCollection<object>>(Document , "..."); 
     ... 
    } 
} 

但發生在xs.Serialize(wr, item);線一條錯誤消息:

InvalidOperation異常:生成XML文檔時發生錯誤。 內部異常:類型ScrumPresentor.ObservableCollection`1 [[ScrumPresentor.UserStory, ScrumPresentor,版本= 1.0.0.0,文化=中性 公鑰=空]]可能無法在此上下文中使用。

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

回答

19

嘗試使用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<Task> Tasks { get; set; } 
    } 

    public class Task : Entity 
    { 
     public uint TaskID { get; set; } 
    } 

    class Util 
    { 
     public static void SerializeObjectToXML<T>(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<Entity> UserStories { get; set; } 

     public static void RunTest() 
     { 
      UserStories = new ObservableCollection<Entity> { 
       new UserStory { 
       StoryID = 127, 
       Status = Status.Active, 
       Tasks = new ObservableCollection<Task>{new Task { TaskID = 11 }, new Task { TaskID = 12 }} 
       }, 

       new UserStory { 
       StoryID = 128, 
       Status = Status.Cancelled, 
       Tasks = new ObservableCollection<Task>{new Task { TaskID = 13 }, new Task { TaskID = 14 }} 
       }, 

       new UserStory { 
       StoryID = 129, 
       Status = Status.Completed, 
       Tasks = new ObservableCollection<Task>{new Task { TaskID = 9 }, new Task { TaskID = 10 }} 
       }, 
      }; 


      ObservableCollection<ObservableCollection<Entity>> Document 
       = new ObservableCollection<ObservableCollection<Entity>>(); 

      Document.Add(UserStories); 
      Util.SerializeObjectToXML<ObservableCollection<ObservableCollection<Entity>>>(Document, @"d:\tmp\junk.txt"); 

     } 
    } 

} 

上面的代碼生成該文本文件:

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfArrayOfEntity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ArrayOfEntity> 
    <Entity xsi:type="UserStory"> 
     <StoryID>127</StoryID> 
     <Status>Active</Status> 
     <Tasks> 
     <Task> 
      <TaskID>11</TaskID> 
     </Task> 
     <Task> 
      <TaskID>12</TaskID> 
     </Task> 
     </Tasks> 
    </Entity> 
    <Entity xsi:type="UserStory"> 
     <StoryID>128</StoryID> 
     <Status>Cancelled</Status> 
     <Tasks> 
     <Task> 
      <TaskID>13</TaskID> 
     </Task> 
     <Task> 
      <TaskID>14</TaskID> 
     </Task> 
     </Tasks> 
    </Entity> 
    <Entity xsi:type="UserStory"> 
     <StoryID>129</StoryID> 
     <Status>Completed</Status> 
     <Tasks> 
     <Task> 
      <TaskID>9</TaskID> 
     </Task> 
     <Task> 
      <TaskID>10</TaskID> 
     </Task> 
     </Tasks> 
    </Entity> 
    </ArrayOfEntity> 
</ArrayOfArrayOfEntity> 
+0

謝謝,但我身邊,與其把'的ObservableCollection '的'的ObservableCollection 工作'我創建了一個包含'ObservableCollection '的類。但是你的代碼真的有用。不管怎麼說,多謝拉。我確實想投你的答案,但我不能,因爲我至少需要15名代表。 – 2011-12-26 09:22:02

+0

您可以提供您爲創建可觀察集合而創建的這個類的代碼片段。我面臨同樣的問題 – 2013-07-17 05:51:51