2011-12-26 7 views
5

observableコレクションのXMLシリアル化に問題があります。ここでObservableCollectionをXMLSerialize

は、私がシリアライズ午前です:

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);行で発生します:ここで

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

は、私はそれをシリアル化する方法である

はInvalidOperationを例外:XMLドキュメントの生成中にエラーが発生しました。 内部例外:タイプScrumPresentor.ObservableCollection`1 [ScrumPresentor.UserStory、 ScrumPresentor、バージョン= 1.0.0.0、文化=中立、 なPublicKeyToken = NULL]は、この文脈で使用されなくてもよいです。

私はVisual Studio 2010、WPFアプリケーションを.NET 4.0で使用しています。

答えて

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 'をcontatinsするクラスを作成します。しかし、あなたのコードは実際に動作します。とにかく、ありがとう。私はあなたの答えを投票したいと思いますが、私は少なくとも15人の担当者が必要なので、私はできません。 –

+0

観察可能なコレクションを配置するために作成したこのクラスのコードを提供できますか?私は同じ問題に直面している –

関連する問題