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

StackOverflow https://stackoverflow.com/questions/3735926

Вопрос

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

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;
}

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

Это было полезно?

Решение

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

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

От MSDN:

«Несоответствующий» атрибут не повлияет на этого участника, потому что его содержащий класс не подвергается воздействию «сериализации».

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

Другие советы

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

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

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

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

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

  2. Они могли бы сделать какое-то обычение атрибута

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

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

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

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

Msdn serializeattribute. Государства, которые «примените атрибут сериализалаэаттрибута к типу, чтобы указать, что экземпляры этого типа могут быть сериализованы». Это подразумевает, что без него класс не может быть сериализован. Я считаю, что я попытался, и сериализация будет выбросить исключение, если он предпринят попытки незначительного типа.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top