Why can't I add attributes when serializing ObservableCollection<T>?

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)

Joh*_*ers 5

XML 序列化不支持这种情况。您根本无法向实现ICollection.

如果您需IXmlSerializable要这样做,则您必须自己实施并完成这项工作。

请注意,您可能会将 XML 序列化与运行时序列化混淆。XML 序列化不关心[Serializable]属性或GetObjectData等。