Почему я не могу добавить атрибуты при сериализации ObservableCollection <T>? - PullRequest
1 голос
/ 13 марта 2011

Я пытаюсь расширить коллекцию 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;
        }
    }
}

1 Ответ

4 голосов
/ 13 марта 2011

Сериализация XML не поддерживает этот сценарий.Вы просто не можете ничего добавить к классу, реализующему ICollection.

Если вам это требуется, вам придется реализовать IXmlSerializable и выполнить работу самостоятельно.

Обратите внимание, что вы можете путать сериализацию XML с сериализацией во время выполнения.Сериализация XML не заботится об атрибуте [Serializable] или GetObjectData и т. Д.

...