Преимущества [NonSerialized], когда [Serializable] не используется - PullRequest
11 голосов
/ 17 сентября 2010

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

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], даже если сам класс не является Сериализуемым?

Ответы [ 5 ]

14 голосов
/ 17 сентября 2010

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

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

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

8 голосов
/ 17 сентября 2010

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

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

From MSDN :

Атрибут «NonSerialized» не повлияет на этот элемент, поскольку содержащий его класс не отображается как «Serializable'.

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

5 голосов
/ 17 сентября 2010

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

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

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

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

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

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

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

4 голосов
/ 17 сентября 2010

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

2 голосов
/ 17 сентября 2010

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

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

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

...