DataContractSerializer: Как сериализировать классы/участников без атрибутов DataContract/DataMember

Вероятно, это не обязательно. Я не нахожу никакой логики для контроля. Поскольку Group, Array и control - все методы get из AbstractControl, именно поэтому метод get появился в элементе управления.

9
задан aleemb 14 November 2009 в 05:35
поделиться

3 ответа

Вы не можете - просто и понятно. Атрибут необходим DataContractSerializer для выбора элементов для сериализации. В контракте с XmlSerializer, который в основном просто сериализует все (если вы явно не указываете его игнорировать), DataContractSerializer является «opt-in» - вы должны явно указать ему (посредством атрибутов), какие поля и / или свойства чтобы сериализовать.

ОБНОВЛЕНИЕ: Как отметили несколько человек, в .NET 3.5 SP1 Microsoft немного ослабила эти правила - любое общедоступное свойство чтения / записи будет автоматически сериализовано DataContractSerializer. В то же время ваш класс также должен иметь конструктор по умолчанию без параметров - звучит как точные требования, которые мы предъявляли к XmlSerializer, когда ....

Конечно, это:

  • не делает t позволяет вам сериализовать что-то частное - если вы хотите сериализовать это, вы должны выставить это как общедоступное свойство чтения / записи
  • не позволяет вам указать определенный выбранный порядок параметров - он просто использует их в порядок, в котором они появляются в классе
  • , теперь требует, чтобы у вас снова был конструктор без параметров в вашем классе для десериализации

. Я все еще думаю, что эти вещи должны быть явными и ясными, поэтому использование тех, которые больше не требуются, открывает путь для ленивых. / небрежное программирование - мне это не нравится. Но если вы хотите, вы можете использовать его сейчас без явной пометки ваших свойств с помощью [DataMember] .....

Marc

t позволяет вам указать определенный выбранный порядок параметров - он будет просто использовать их в том порядке, в котором они появляются в классе
  • теперь требует, чтобы у вас снова был конструктор без параметров в вашем классе для десериализации
  • Я все еще думаю, что они вещь должна быть ясной и понятной, поэтому необходимость в тех, кто больше не нужен, открывает путь для ленивого / небрежного программирования - мне это не нравится. Но если вы хотите, вы можете использовать его сейчас без явной пометки ваших свойств с помощью [DataMember] .....

    Marc

    t позволяет вам указать определенный выбранный порядок параметров - он будет просто использовать их в том порядке, в котором они появляются в классе
  • теперь требует, чтобы у вас снова был конструктор без параметров в вашем классе для десериализации
  • Я все еще думаю, что они вещь должна быть ясной и понятной, поэтому необходимость в тех, кто больше не нужен, открывает путь для ленивого / небрежного программирования - мне это не нравится. Но если вы хотите, вы можете использовать его сейчас без явной пометки ваших свойств с помощью [DataMember] .....

    Marc

    6
    ответ дан 4 December 2019 в 23:41
    поделиться
    [118963 Я верю, что это возможно. Если вы реализуете интерфейс ISerializable, то сериализатор использует вашу реализацию вместо атрибутов. Хотя я думаю, вам все равно придется пометить класс [Serializable].

    Это немного больше работы, чем добавление атрибутов, но это работает.

    0
    ответ дан 4 December 2019 в 23:41
    поделиться

    Просто отметьте класс атрибутом [Serializable]. Любые члены, для которых вы не хотите сериализовать, пометьте [NonSerialized]. Обратите внимание, что [Serializable] вызывает сериализацию всех полей по умолчанию, тогда как [DataContract] по умолчанию не сериализует никаких полей, кроме отмеченных [DataMember].

    0
    ответ дан 4 December 2019 в 23:41
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: