Несколько ответов рассмотрели причины, почему вы можете захотеть использовать сериализацию в целом. Вы, похоже, также хотите знать, почему у определенного класса есть атрибут [Serializable]
, и вам интересно, почему это могло быть сделано.
С ASP.NET хранилище состояний по умолчанию - InProc
, которое позволяет хранить любой объект в качестве ссылки и оставить его в куче. Это наиболее эффективный способ хранения состояния сеанса, однако он работает только в том случае, если вы используете один рабочий поток или если все состояние сеанса может быть автоматически восстановлено, если рабочий поток должен измениться (маловероятно). Для других режимов хранения состояния (StateServer
и SQL Server
) все объекты состояния сеанса должны быть сериализуемыми, поскольку механизм ASP.NET сначала сериализует эти объекты с помощью двоичной сериализации перед отправкой их на носитель данных.
В вашем случае вы можете использовать InProc
. Одна из причин состоит в том, чтобы по-прежнему отмечать все классы, которые используются в состоянии сеанса как Serializable
, и протестировать их таким образом, что вам может понадобиться изменить это в будущем (например, для использования веб-фермы). Если вы не разрабатываете свои классы состояния сеанса с учетом этого, будет довольно сложно выполнить миграцию в будущем.
Кроме того, только потому, что вы можете удалить атрибут Serializable
, и программа «работает» в одной среде не означает, что она будет работать в другой среде. Например, это может сработать для вас в тестовом веб-сервере Visual Studio (который всегда использует экземпляр состояния сеанса InProc
) и даже в экземпляре IIS разработки, но затем, возможно, для экземпляра IIS для производства используется другой режим хранения.
Эти различия в окружающей среде/конфигурации не обязательно ограничиваются приложениями ASP.NET. Существуют и другие механизмы приложений, которые могут выполнять это или даже автономные приложения (нетрудно построить такую конфигурационную среду).
Наконец, вы можете работать с библиотекой, которая может быть использована различными приложениями. Некоторым может потребоваться сохранить состояние в сериализованном виде, а другие - нет.
Из-за этих факторов зачастую очень хорошая идея, по крайней мере при создании библиотеки, рассмотреть возможность маркировки классов простого класса или классов управления состоянием [Serializable]
. Имейте в виду, что это увеличивает работу для тестирования этих классов, и есть ограничения на то, что может быть сериализовано (т. Е. Класс, содержащий ссылку на сокет или ссылку на открытый файл, не может быть хорошим кандидатом для сериализации, поскольку открытые внешние ресурсы не могут быть сериализованы) поэтому не злоупотребляйте этим.
Вы спрашивали, будет ли использование [Serializable]
медленнее. Нет, этого не будет. Этот атрибут не влияет на производительность. Однако, если среда приложения изменена для сериализации объекта, тогда да, производительность будет затронута. Это процесс сериализации и десериализации, который медленнее, чем просто хранение объекта в куче. [Обратите внимание, что некоторые подпрограммы могут быть записаны для поиска атрибута Serializable
, а затем выберите сериализацию, но это редко; обычно это похоже на ASP.NET и оставляется администратору или пользователю, чтобы решить, хотите ли они изменить среду хранения.]
Возможно ли, что он хранится в SessionState при использовании Out-of-Proc/SQL? Эти режимы сеанса требуют сериализации. – vcsjones
Не уверен, что я следую вашему вопросу. Вы действительно спрашиваете: «Почему я хотел бы сериализовать объект?» –
@Kirk Woll, это правильно – user194076