Подтвердить что ты не робот

Установите для параметра "NonSerializedAttribute" значение "Авто"

Это невозможно сделать в С#. Любой способ сделать это?

...

смеяться, в случае, если мой маленький каламбур не был понят, я имею в виду: как я могу пометить свойство в С# как NonSerialized? Конечно, когда свойство содержит логику, естественно, что это невозможно, но Auto-Properties являются сериализуемыми и, как таковые, я ожидаю, что у меня будет некоторый способ разрешить его сериализацию.

4b9b3361

Ответ 1

Изменить *: Автореализованные свойства поддерживаются анонимным полем, к которому у вас действительно нет доступа, атрибуты предназначены для управления механизмом, основанным на отражении. Эти поля не могут ссылаться на механизм отражения (потому что они анонимны). Эта функция компилятора потребует значительных изменений в генерации автоматических свойств... Также потребовалось бы, чтобы компилятор обрабатывал автоматические свойства как поля с целью маркировки атрибутов полей.

Чтобы ответить на более фундаментальную часть вопроса, вы считали, что Auto-Properties сериализованы и поэтому должен быть способ контролировать их сериализацию. Вы правы, но свойства auto предназначены для сокращения и никогда не были предназначены для обеспечения полной гибкости, а скорее для того, чтобы вы могли легко расширить свою функциональность "длинным" способом, если вам когда-либо понадобится.

  • Я добавил более подробные ответы от комментариев к телу ответа.

Ответ 2

  [NonSerialized]
  public string MyProperty { get; set; }

Является ошибкой

  [XmlIgnore]
  public string MyProperty { get; set; }

Не ошибка

NonSerialized Указывает, что поле сериализуемого класса не должно быть сериализовано.

XmlIgnore Указывает метод Serialize XmlSerializer не сериализовать общедоступное поле или значение свойства чтения/записи

поэтому, если вы спросите

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

ответ "да", если вы используете XmlSerializer

Ответ 3

Для событий вы можете использовать [field:NonSerialized], но для авто-свойств это не работает. Похоже, что это был бы очень логичный способ обработки авто-свойств, но по какой-то причине он, похоже, не был реализован.

Ответ 4

Теория я да, это возможно. В практическом плане это невозможно.

Сериализационные классы работают только в частных полях. Когда вы определяете свойство auto; за кулисами компилятор автоматически создает для него частное поле. Это означает, что это языковая функция, а не функция .net framework.

Также классы сериализации включены в redbits, что означает любое изменение, запрещенное совместимостью, кроме исправлений ошибок.

Надеюсь, это поможет.

Ответ 5

То, что было сказано выше, является правильным: вы не можете запретить сериализацию автоматически реализованного свойства, установив такой атрибут, как [NonSerialized]. Это просто не работает.

Но какая работа является атрибутом [IgnoreDataMember], если вы работаете с WCF [DataContract]. Так

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

    [IgnoreDataMember]
    public string MySecret { get; set; }
}

будет сериализован под WCF.

Хотя, поскольку WCF является технологией отказа, вы также можете просто опустить [IgnoreDataMember], и он также будет работать. Так что, может быть, мой комментарий немного академичен, -)

Ответ 6

Возможно, вы можете сделать это с помощью Mono.Cecil, библиотеки манипуляции байт-кода. Теоретически, вы можете добавить пользовательские атрибуты в скрытое поле поддержки. Это настолько неудобно, однако, что я не думаю, что это заслуживает примера.

Если у вас было большое приложение с вашим собственным постпроцессором, вы можете подумать о создании своей собственной замены для NonSerializedAttribute, которая может быть применена к свойствам. Постпроцессор может затем использовать Mono.Cecil или аналогично применять NonSerializedAttribute к полям поддержки. Для крупных приложений довольно часто приходится выполнять такую ​​постобработку, чтобы сохранить этот дополнительный бит ввода.

Ответ 7

[NonSerialized] public decimal yourproperty;

(десятичный пример).

Также помните, если вы хотите, чтобы ваш класс автоматически инициализировал несериализованный элемент, используйте интерфейс IDeserializationCallback, а затем реализуйте IDeserializationCallback.OnDeserialization.