Какой тип использовать для сохранения набора значений в состоянии пользовательского элемента управления? - PullRequest
1 голос
/ 07 апреля 2009

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

protected override object SaveControlState()
protected override void LoadControlState(object savedState)

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

Я пытался сделать это с

[Serializable]
public class ControlSate : Dictionary<string, object>, ISerializable
{   
    void ISerializable.GetObjectData(SerializationInfo info, 
      StreamingContext context)
    {
    }

    public ControlSate(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {    
    }

    public ControlSate()
        : base()
    {
    }
}

но это не сработало, и в поисках решения я прочитал, что «Словарь» не сериализуем.

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

Ответы [ 4 ]

2 голосов
/ 07 апреля 2009

Пока LoadControlState передает вам Object, возможно, что Object будет Object[]. Другими словами, вы можете хранить массив Objects в ControlState. Я также считаю, что ControlState оптимизирован для работы с типом System.Web.UI.Pair, поэтому вы можете создавать деревья объектов в ControlState, если хотите.

Пожалуйста, прочитайте эту превосходную статью , чтобы узнать, как лучше всего хранить несколько значений в ControlState.

0 голосов
/ 21 мая 2009

Я бы поставил под сомнение атрибут srializable для свойства в соответствии с компилятором:

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

0 голосов
/ 07 апреля 2009

Странно. Если вы посмотрите на общий словарь в Reflector, он имеет атрибут [Serializable]. Я заметил, что у вас есть словарь <строка, объект>, так что U = «объект» здесь. Каков реальный тип «U»? Если вы используете сложный тип для «U», то он также должен быть помечен как [Serializable]. Вам также может понадобиться явно пометить каждое поле и / или свойство как [Serializable]. Если это не работает, возможно, стоит попробовать использовать List >

0 голосов
/ 07 апреля 2009

Для хранения сложного состояния имеется интерфейс IStateManager.

...