Тип не сериализуем, потому что он не публичный? - PullRequest
5 голосов
/ 14 февраля 2011

У меня есть открытый класс, который не будет сериализован должным образом.При попытке выдается следующее исключение:

Тип контракта данных «MyProject.MyClass» не сериализуем, поскольку он не является общедоступным.Обнародование типа исправит эту ошибку.Кроме того, вы можете сделать его внутренним и использовать атрибут InternalsVisibleToAttribute в вашей сборке, чтобы включить сериализацию внутренних элементов - см. Документацию для получения дополнительной информации.Имейте в виду, что это имеет определенные последствия для безопасности.

Мой класс является публичным, хотя:

[DataContract]
public class MyClass
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    private int Count;

    public MyClass()
    {
        Name = string.Empty;
        Count = 0;
    }
}

Почему я получаю это исключение, когда классявно публично?

Ответы [ 2 ]

8 голосов
/ 14 февраля 2011

В приложениях Windows Phone 7 нельзя сериализовать частных участников:

Что ж, просто так получается, что приложения WP7 работают в среде «частичного доверия» и вне «полного доверия», DataContractSerializer отказывается сериализовать или десериализовать непубличных участников. Конечно, это исключение было поглощено внутри .NET, так что все, что я когда-либо видел, было это странное сообщение о вещах, которые я точно знал, были публичными, «не публичными». Я изменил все частные поля, которые я сериализовал для публичных, и все работало просто отлично. http://geekswithblogs.net/mikebmcl/archive/2010/12/29/datacontractserializer-type-is-not-serializable-because-it-is-not-public.aspx

Изменение кода во избежание сериализации закрытых членов устраняет проблему.

2 голосов
/ 14 февраля 2011

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

Чтобы обойти это ограничение, вы можете выполнить одно из следующих действий:

  • Избавиться от атрибута DataMember в Count
  • Сделать Count общедоступным
  • Реализовать IXmlSerializable (или любую другую сериализацию, необходимую вам) и сериализовать эти закрытые члены вручную
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...