После десериализации с использованием DataContractSerializer, Collection становится доступным только для чтения

Это должно быть довольно просто, но после десериализации моих бизнес-объектов с помощью DataContractSerializer все пользовательские коллекции внутри них стали доступны только для чтения.

Чтобы быть точным, я пытаюсь манипулировать коллекцией после десериализации, меняя элементы внутри коллекции, но это исключение, говорящее, что Коллекция доступна только для чтения. Однако до сериализации все нормально.

Произошло необработанное исключение типа "System.NotSupportedException" в mscorlib.dll Дополнительная информация: Коллекция доступна только для чтения.

Вот как я украсил свой класс коллекции.

[Serializable]
[DataContract]
[KnownType(typeof(RuleBase))]
[KnownType(typeof(RuleSet))]
public class GenericRuleCollection : ObservableCollection<IRule>
{
    //...
}

Так я украсил свой класс бизнес-объектов.

[Serializable]
[DataContract]
public class RuleSet : GenericRuleContainer
{
    //...
}

[Serializable]
[DataContract(IsReference = true)]
public abstract class GenericRuleContainer : GenericRule, IRuleContainer
{        
    private GenericRuleCollection _children;     
    [DataMember]
    public GenericRuleCollection Children
    {
        get { return _children; }
        set { SetProperty(ref _children, value); }
    }
    //...
}

Часть кода сериализации и десериализации:

public class DataContractSerializer<T>
{
    public void SerializeToFile(string fileName, T obj)
    {
        var serializer = new DataContractSerializer(typeof(T));
        using (FileStream fs = File.Open(fileName, FileMode.Create))
        {                
            serializer.WriteObject(fs, obj);
        }
    }

    public T DeserializeFromFile(string fileName)
    {
        var serializer = new DataContractSerializer(typeof(T));
        using (FileStream fs = File.Open(fileName, FileMode.Open))
        {
            object s2 = serializer.ReadObject(fs);
            return (T)s2;
        }
    }
}

1 ответ

Решение

Хорошо после некоторого случайного исследования на Google я смог решить эту проблему, изменив атрибут атрибута с [DataContract] в [CollectionDataContract] на моем собственном классе коллекции.

[Serializable]
[CollectionDataContract]
[KnownType(typeof(RuleBase))]
[KnownType(typeof(RuleSet))]
public class GenericRuleCollection : ObservableCollection<IRule>
{
    //...
}
Другие вопросы по тегам