【问题标题】:XMLSerialize an ObservableCollectionXMLSerialize 一个 ObservableCollection
【发布时间】:2011-12-26 06:17:14
【问题描述】:

我在可观察集合的 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<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=null]] 不能在这种情况下使用。

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

【问题讨论】:

    标签: c# .net-4.0 observablecollection xmlserializer


    【解决方案1】:

    尝试使用 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>
    

    【讨论】:

    • 谢谢,但我没有将ObservableCollection&lt;UserStory&gt; 放在ObservableCollection&lt;Entity&gt; 中,而是创建了一个包含ObservableCollection&lt;UserStory&gt; 的类。但是您的代码确实有效。不管怎么说,多谢拉。我确实想投票给你的答案,但我不能,因为我至少需要 15 个代表。
    • 您能否提供您为放置可观察集合而创建的此类的代码。我也面临同样的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2012-10-23
    • 1970-01-01
    • 2017-05-24
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多