Jac*_*obJ 1 wpf inheritance serialization xml-serialization observablecollection
我正在尝试使用一些自定义属性扩展 ObservableCollection 并对其进行序列化。但是,我似乎无法让它序列化这些属性。我正在使用 .NET 4.0,他们修复了 ObservableCollection 的序列化问题,但仍然有问题。我的预感是 GetObjectData 是在基类上调用的,而不是我的。有任何想法吗?
[Serializable]
[XmlRoot(ElementName = "MyCollection")]
public class MyCollection : ObservableCollection<MyItem>, ISerializable
{
private string name;
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
}
private MyCollection()
{
Name = string.Empty;
}
public MyCollection(string name)
{
Name = name;
}
public MyCollection(SerializationInfo info, StreamingContext context)
{
Name = (string)info.GetValue("Name", typeof(string));
}
[XmlAttribute]
public string Name
{
get { return name; }
protected set
{
string originalName = name;
name = value;
if (originalName != name)
OnPropertyChanged(new PropertyChangedEventArgs("Name"));
}
}
public void SaveToFile(string path)
{
string directory = Path.GetDirectoryName(path);
if (!Directory.Exists(directory))
Directory.CreateDirectory(directory);
XmlSerializer serializer = new XmlSerializer(typeof(MyCollection));
using (TextWriter textWriter = new StreamWriter(path))
{
serializer.Serialize(textWriter, this);
textWriter.Close();
}
}
public static MyCollection LoadFromFile(string path)
{
XmlSerializer deserializer = new XmlSerializer(typeof(MyCollection));
using (TextReader textReader = new StreamReader(path))
{
MyCollection myCollection = (MyCollection)deserializer.Deserialize(textReader);
textReader.Close();
return myCollection;
}
}
}
Run Code Online (Sandbox Code Playgroud)
XML 序列化不支持这种情况。您根本无法向实现ICollection.
如果您需IXmlSerializable要这样做,则您必须自己实施并完成这项工作。
请注意,您可能会将 XML 序列化与运行时序列化混淆。XML 序列化不关心[Serializable]属性或GetObjectData等。