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

Преимущества [NonSerialized], когда [Serializable] не используется

Я просматриваю какой-то существующий код в проекте, над которым я работаю, и нашел класс, который реализован как:

public class ThingOne
{
    private int A;

    private int B;

    [NonSerialized]
    private System.Timers.Timer timer1;
}

Разве это не похоже на это?

[Serializable]
public class ThingOne
{
    private int A;

    private int B;

    [NonSerialized]
    private System.Timers.Timer timer1;
}

Или есть ли дополнительные преимущества для добавления [NonSerialized], даже если сам класс не является Serializable?

4b9b3361

Ответ 1

NonSerialized не будет иметь эффекта, если Serializable не используется. По умолчанию классы и их члены не являются сериализуемыми.

Единственное преимущество объявления чего-то NonSerialized, когда класс не является сериализованным, заключается в том, что класс наследуется объектом Serialized, а затем унаследованный член будет не сериализуемым.

От MSDN:

Атрибут

'NonSerialized' не будет влияют на этого участника, поскольку его класс не отображается как 'Сериализуемый'.

По умолчанию классы и их члены не являются сериализуемыми. Атрибут NonSerializedAttribute необходим только в том случае, если член сериализуемого класса не должен быть сериализован.

Ответ 2

Или есть ли дополнительные преимущества для добавления [NonSerialized], даже если сам класс не является Serializable?

Класс не запечатан, поэтому другой класс может наследовать от этого объекта. Этот класс может быть помечен как Serializable, а затем атрибут NotSerializable будет входить в игру. (хотя, как указывается не для частных членов).

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

Ответ 3

Я могу думать о двух причинах:

  • Очень важно, чтобы поле не сериализовалось. Следовательно, если в будущем класс будет сериализуемым, это не приведет к ошибке, неэффективности или безопасности, потому что без него маркировка class serialisable также сделает это для поля.

  • Они могут выполнять какое-то пользовательское использование атрибута

В случае 2 в другом месте кода будет ясно, что это то, что происходит. Однако номер 1 является хорошей практикой.

Случай 1 - хорошая практика, может стоить балансировать YAGNI ( "Вам не понадобится" - не делать работу "в случае необходимости" ) с учетом "хорошо, но если мне это нужно позже, это будет катастрофой, если кто-то пропустит это исключение.

Итак, хотя это не имеет никакого эффекта здесь, это определенно хорошая практика для сценариев, где она начинает иметь эффект.

Edit: Еще одна возможность заключается в том, что она является отчаянной от предыдущей версии, где она действительно сериализуется, или автор в то время был в двух умах, и он никогда не был полностью "закончен" (рабочий код когда-либо полностью завершен?). Просто потому, что что-то в коде, не означает, что это должно было быть таким. Тем не менее, если действительно важно, чтобы что-то не было сериализовано, я по-прежнему считаю хорошей практикой отметить это по причине, приведенной выше.

Ответ 4

MSDN SerializeAttribute утверждает, что "Применить атрибут SerializableAttribute к типу, чтобы указать, что экземпляры этого типа могут быть сериализованы". Это означает, что без него класс не может быть сериализован. Я считаю, что я попытался это сделать, и сериализовать вызовет исключение, если оно будет предпринято в NonSerializable Type.

Ответ 5

Я согласен с Грегом, MSDN утверждает это аналогичным образом, ссылаясь на ссылки - хорошая идея.

"По умолчанию классы и их члены не являются сериализуемыми. Атрибут NonSerializedAttribute необходим только в том случае, если член сериализуемого класса не должен быть сериализован."

http://msdn.microsoft.com/en-us/library/dwys85sk(VS.80).aspx