Ваша проблема в том, что у Джексона есть стандарт для преобразования Карты в JSON. Ключи карты используются в качестве имен свойств в результатах JSON.
Map<String, Double> groceryPrices = new HashMap<>();
groceryPrices.put("apple", 0.25);
groceryPrices.put("orange", 0.30);
Это естественным образом переводится в объект JSON:
{
"apple": 0.25,
"orange": 0.30
}
Проблема в том, что вы используете сложный объект для представления ключа. Не существует простого метода для сериализации и десериализации вашего сложного объекта в / из строки.
Если вы не хотите писать собственную сериализацию, я предлагаю вам изменить структуру данных. Ваша текущая структура связывает модель с целыми числами. Вы можете сложить список целых чисел в сам объект Model:
Map<String, Model> models; // This could map modelId -> Model which now contains the integers
Черт! Не помещайте Список <> в ViewState! Это будет крупно!
Если Вы добавите Список <строка>, которая содержит два элемента - "abc" и "xyz" в ViewState, то это вырастет на 312 байтов.
Если вместо этого Вы добавите строку [], который содержит те же два элемента, то это только вырастет на 24 байта.
И это - просто списки строк! Можно поместить классы там, как Corey Downie предполагает, но ViewState распространится!
Для хранения этого разумным размером необходимо будет перейти к некоторому усилию преобразовать список объектов в массивы строк и назад снова.
Как альтернатива, рассмотрите помещение Ваших объектов в Сессию: тем путем Ваши объекты будут храниться на сервере, вместо того, чтобы быть сериализированными в ViewState и отправленными к браузеру и назад.
если Вы говорите о сохранении данных через обратные передачи той же страницы затем, можно вручную добавить объекты к ViewState и получению их На Загрузке.
Один способ преодолеть проблему размера с универсальным списком состоит в том, чтобы сохранить его в ViewState как его основной тип массива:
protected List<string> Items
{
get
{
if (ViewState["Items"] == null)
ViewState["Items"] = new string[0];
return new List<string>((string[])ViewState["Items"]);
}
set
{
ViewState["Items"] = value.ToArray();
}
}
Я соглашаюсь, что существуют проблемы со Списком <> в состоянии отображения, но оно действительно работает. Обратите внимание, что нет никакого метода set на этом дизайном. Вам нужна ссылка на объект объекта списка, и Ваш получать метод может новый список при необходимости.
protected List<myClass> Items
{
get
{
if (ViewState["myClass"] == null)
ViewState["myClass"] = new List<myClass>();
return (List<myClass>)ViewState["myClass"];
}
}
Можно сохранить их в состоянии отображения средств управления
public List<myClass> Items{
get { return this.ViewState["itemsKey"] }
set { this.ViewState["itemsKey"]= value; }
}