Silverlight: DataContractSerializer не может обрабатывать свойства коллекции только для чтения - PullRequest
1 голос
/ 07 мая 2010

Для нашего проекта Silverlight (SL4) я использую модель, которая может содержать списки (IList<AnotherModel>). В соответствии с хорошей практикой и правилом CA2227: CollectionPropertiesShouldBeReadOnly свойства IList не имеют открытого сеттера. Мы сериализуем модель, используя DataContractSerializer, который работает. Но когда я пытаюсь десериализовать, SecurityException генерирует метод ReadObject(Stream) DataContractSerializer, жалуясь, что целевое свойство (указывающее на свойство IList) не может быть установлено из-за отсутствия общедоступного установщика.

Поскольку DataContractSerializer является запечатанным и не расширяемым и не гибким, поэтому в настоящее время я не вижу возможности добавить какие-то дополнительные правила, которые позволяют десериализовать ILists, используя цикл foreach для метода Add() или какой-либо другой метод. передачи предметов коллекции.

Я также пытался покопаться в DataContractSerializer источнике (используя Reflector) для создания небольшого разветвления, но похоже, что мне нужно копать очень глубоко, и репликация целых классов сериализации не представляется жизнеспособным решением. .

Видите ли вы еще один шанс сериализовать Список без публичного установщика, используя DataContractSerializer?

Большое спасибо заранее за ваши идеи!


UPDATE
Решено с помощью XmlSerializer.


Thomas

Ответы [ 2 ]

1 голос
/ 10 мая 2010

В нашем случае мы обнаружили, что не строго привязаны к DataContractSerializer, и, что интересно, XmlSerializer поддерживает сериализацию ILists только для чтения! Фактически, он даже не допускает общедоступного установщика для интерфейса IList в этом случае (не может десериализовать свойство интерфейса), но (де-) сериализация элементов ILists работает как чудо.

Единственным изменением для нас было добавление [XmlInclude] атрибутов в дополнение к [KnownType] (и, конечно, замена нескольких строк с DataContractSerializer.WriteObject(...) на XmlSerializer.Serialize(...).

Спасибо за вашу поддержку! =)

1 голос
/ 07 мая 2010

Используйте конкретные (изменяемые) типы и дайте DCS то, что он хочет.

Это хорошо работает для меня (я обычно только указываю конкретные типы в классах DataContractSerializable).Весь подход универсальной сериализации - мойка и идет с каваетами - выбирай свои битвы.В качестве альтернативы используйте другой подход, например ISerializable (uhg).

...