2011-12-26 32 views
5

मुझे देखने योग्य संग्रह के एक्सएमएल क्रमबद्धता में कोई समस्या है।XML एक अवलोकन योग्य चयन

यहाँ मैं क्या कर रहा हूँ 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; } 
    ... 
} 

यहाँ है मैं इसे कैसे को क्रमानुसार:

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, संस्कृति = तटस्थ, PublicKeyToken = अशक्त]] इस संदर्भ में इस्तेमाल नहीं किया जा सकता है।

मैं विजुअल स्टूडियो 2010, .NET 4.0 में WPF अनुप्रयोग का उपयोग कर रहा हूं।

उत्तर

19

सिस्टम.Xml.Serialization.Xml का उपयोग करने का प्रयास करें विशेषता शामिल करें। मुझे यकीन नहीं है कि क्या मैं संग्रह के संग्रह के अपने इरादे को सही ढंग से समझता हूं, लेकिन यह मानते हुए कि आप यही चाहते हैं, यहां एक कार्य समाधान है।

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 'डालने की है कि चारों ओर एक काम करो', मैं एक वर्ग बनाता हूं जो 'पर्यवेक्षण योग्यता ' contatins। लेकिन आपका कोड वास्तव में काम करता है। फिर भी धन्यवाद। मैं आपका जवाब वोट देना चाहता हूं लेकिन मैं तब से नहीं कर सकता क्योंकि मुझे कम से कम 15 प्रतिनिधि की आवश्यकता है। –

+0

क्या आप इस वर्ग के लिए कोड का टुकड़ा प्रदान कर सकते हैं जिसे आपने अवलोकन संग्रह डालने के लिए बनाया है। मुझे एक ही समस्या का सामना करना पड़ रहा है –

संबंधित मुद्दे