我在观察的集合的XML序列化有问题。
I am having a problem in the xml serialization of observable collection.
下面就是我序列化:
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,项目)发生错误;
行说:
InvalidOperation异常:有一个错误生成XML文档。 内部异常的:该类型的Scrum presentor.ObservableCollection`1 [Scrum的presentor.UserStory, Scrum的presentor,版本= 1.0.0.0,文化=中立, 公钥=空]]可能无法在这种情况下使用。
InvalidOperation Exception: There was an error generating the XML document. Inner Exception: The type ScrumPresentor.ObservableCollection`1[[ScrumPresentor.UserStory, ScrumPresentor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] may not be used in this context.
我使用在.NET 4.0中的Visual Studio 2010,WPF应用程序。
I am using Visual Studio 2010, WPF application in .NET 4.0.
请,我真的需要你的帮助。 先谢谢了。
Please, I really need your help. Thanks in advance.
尝试使用 System.Xml.Serialization.XmlInclude 属性。我不知道我是否正确地理解你的集合的集合的意图,但假设是你想要的,这里是一个可行的解决方案。输出遵循code:
Try using the System.Xml.Serialization.XmlInclude attribute. I'm not sure if I correctly understand your intent of a collection of collections, but assuming that is what you want, here is a working solution. The output follows the code:
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");
}
}
}
以上code生产该文本文件:
The above code produced this text file:
<?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>