Какие типы объектов мы можем поместить в состояние просмотра? - PullRequest
5 голосов
/ 27 августа 2010

Я хочу знать, почему мы должны установить атрибут serializable для сохранения объекта в состоянии просмотра.

Также, какой тип объектов мы можем хранить в состоянии просмотра?

Ответы [ 5 ]

9 голосов
/ 27 августа 2010

ViewState сериализуется с использованием двоичной сериализации с использованием ObjectStateFormatter . Цитата из документации:

Класс ObjectStateFormatter равен оптимизирован для сериализации и форматирования многих общие ссылочные типы .NET Framework, а также константы. Следующие В таблице перечислены типы, которые оптимизировано.

Array, DateTime, Int16, String, ArrayList, Double, Int32, String [], Boolean, Enum, null (ничего), String.Empty, Byte, Hashtable, пара, тройка, символ, HybridDictionary, Single, Type, Color, IDictionary,

Дополнительно, пока обычные типы строк и строки массивы записываются в и из сериализованный двоичный писатель без изменений, некоторые строки оптимизируются путем создания таблицы внутренних строк. Строки оптимизированы с использованием этих таблиц, если Строка имеет связанный TypeConverter объект или если строка на самом деле экземпляр класса IndexedString.

Другие типы, не перечисленные выше, двоично-сериализованный с использованием Объект BinaryFormatter, если они реализовать интерфейс ISerializable или украшены Атрибут SerializableAttribute. Класс ObjectStateFormatter не является оптимизирован для любого из них Сериализуемые типы.

Если класс ObjectStateFormatter встречает тип, который не Сериализуемый, ArgumentException исключение.

Чтобы объект был двоичным сериализуемым в ViewState, его необходимо оформить атрибутом [Serializable]. Таким образом, вы можете вставить ViewState любой объект, имеющий этот атрибут. Обратите внимание, что простые типы, такие как string, int, float, ... также могут быть помещены в ViewState.

1 голос
/ 26 ноября 2010

Не помещайте объекты типа Guid в ViewState. ObjectStateFormatter не распознает их, и они защемляются при использовании BinaryFormatter с колоссальными 130 байтами на GUID. Вам лучше хранить их как строки и анализировать их при чтении. Однако это не всегда работает, например, при использовании Guid в качестве ключа в сетке.

Кроме того, при загрузке / сохранении перечислений в ViewState вы немного выиграете, преобразовав их из / в целочисленный тип. В свойстве вашего элемента управления вы знаете требуемый тип перечисления, который не нужно кодировать в сериализованном ViewState.

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

1 голос
/ 27 августа 2010

Какие объекты - согласно Даррену и Эндрю - любые сериализуемые. Почему Сериализуемый? Так что состояние может быть сериализовано как

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTY1NTgzODUwMg9kFgJmD2QWAgIDD2QWAgIBD2QWBgIBDw8WAh4EVGV4dAUXU3VwcGxpZXIgUG9y

Однако на практике необходимо сводить viewstate к минимуму, поскольку это влияет на производительность полосы пропускания / размера страницы. Элементы управления являются наиболее распространенными пользователями viewstate.

1 голос
/ 27 августа 2010

Типы должны быть сериализуемыми для помещения в ViewState. ViewState представляет собой сериализованную коллекцию объектов, поэтому в нее можно помещать любые сериализуемые объекты.

0 голосов
/ 27 августа 2010

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

...