2011-12-26 26 views
5

Tôi đang gặp sự cố trong xml serialization của bộ sưu tập quan sát được.XMLSerialize một ObservableCollection

Dưới đây là những gì tôi đang serializing:

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; } 
    ... 
} 

Dưới đây là cách tôi serialize nó:

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 , "..."); 
     ... 
    } 
} 

Nhưng một lỗi xảy ra trong dòng xs.Serialize(wr, item); nói:

InvalidOperation Ngoại lệ: Đã xảy ra lỗi khi tạo tài liệu XML. Nội ngoại lệ: Loại ScrumPresentor.ObservableCollection`1 [[ScrumPresentor.UserStory, ScrumPresentor, Version = 1.0.0.0, Culture = trung tính, PublicKeyToken = null]] có thể không được sử dụng trong bối cảnh này.

Tôi đang sử dụng ứng dụng Visual Studio 2010, WPF trong .NET 4.0.

Trả lời

19

Hãy thử sử dụng thuộc tính System.Xml.Serialization.XmlInclude. Tôi không chắc liệu tôi có hiểu chính xác ý định của bạn về một bộ sưu tập các bộ sưu tập hay không, nhưng giả sử đó là những gì bạn muốn, đây là một giải pháp làm việc. Kết quả sau các mã:

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"); 

     } 
    } 

} 

Đoạn mã trên tạo ra file văn bản này:

<?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

Cảm ơn, nhưng tôi làm một công việc xung quanh đó thay vì đưa 'cái ObservableCollection ' trong 'ObservableCollection ', Tôi tạo ra một lớp học mà contatins 'ObservableCollection '. Nhưng mã của bạn thực sự hoạt động. Dù sao cũng cảm ơn. Tôi muốn bình chọn câu trả lời của bạn nhưng tôi không thể vì tôi ít nhất cần 15 đại diện. –

+0

Bạn có thể cung cấp đoạn mã cho lớp học này mà bạn đã tạo để đưa bộ sưu tập quan sát được không. Tôi đang đối mặt với cùng một vấn đề –

Các vấn đề liên quan