Установите для параметра "NonSerializedAttribute" значение "Авто"
Это невозможно сделать в С#. Любой способ сделать это?
...
смеяться, в случае, если мой маленький каламбур не был понят, я имею в виду: как я могу пометить свойство в С# как NonSerialized? Конечно, когда свойство содержит логику, естественно, что это невозможно, но Auto-Properties являются сериализуемыми и, как таковые, я ожидаю, что у меня будет некоторый способ разрешить его сериализацию.
Ответы
Ответ 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.