Я изучаю ASP.net с помощью С#, и я хотел бы знать, можем ли мы хранить данные, отличные от строк, в файлах cookie, таких как дата/время или десятичная или двойная.
Какие типы данных могут храниться в файлах cookie?
Ответ 1
Данные любого типа, которые вы можете сериализовать в string
и десериализовать обратно в этот тип, могут быть сохранены в файле cookie. Например: Object
, DateTime
, Int
, Decimal
и т.д.
Это полностью зависит от вашей логики кодирования; строка может быть преобразована обратно на что угодно почти,
- Объект
- Int
- Decimal
- DateTime
- Ссылка на любую временную таблицу/значение u может храниться для гостевых пользователей
Можно ли получить объект из файла cookie?
Нет, не так, как вы пытаетесь. Не думайте с точки зрения ASP.NET. Подумайте о том, что на самом деле существует HTTP cookie. Это HTTP-заголовок. Заголовки HTTP - это только строковые значения. Понятие объекта не существует в протоколе HTTP.
Итак, вам нужно будет сериализовать объект .NET, который у вас есть, и затем десериализовать его.
В .NET существуют различные сериализаторы, которые вы могли бы использовать. Например, используйте BinaryFormatter, а затем Base64 encode полученный массив байтов для хранения в файл cookie.
десериализация - это обратный процесс - вы читаете значение из файла cookie (который всегда является строкой), затем вы Base64 decode it в массив байтов, который вы десериализуете обратно к исходному объекту с помощью BinaryFormatter
.
Помните, что размер файлов cookie ограничен и может варьироваться в зависимости от разных браузеров. Поэтому не стоит ставить большие объекты в файлы cookie. Значение будет удалено, и вы получите поврежденные данные. Я бы не использовал их, если полное сериализованное значение объекта больше 2 тыс. Символов.
Обозначьте описанный выше процесс:
public class cookieTest
{
testC test;
public cookieTest()
{
test = new testC();
}
public testC GetTestC
{
get
{
var cookie = HttpContext.Current.Request.Cookies["test"];
return Deserialize<testC>(cookie.Value);
}
set
{
var cookie = new HttpCookie("test");
cookie.Expires = DateTime.Now.AddHours(8);
cookie["first"] = Serialize(value);
System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
}
}
private static string Serialize<T>(T instance)
{
using (var stream = new MemoryStream())
{
var serializer = new BinaryFormatter();
serializer.Serialize(stream, instance);
return Convert.ToBase64String(stream.ToArray());
}
}
private static T Deserialize<T>(string value)
{
using (var stream = new MemoryStream(Convert.FromBase64String(value)))
{
var serializer = new BinaryFormatter();
return (T)serializer.Deserialize(stream);
}
}
}
Кредит и Справка
Ответ 2
Данные всегда сохраняются как тип String
. Однако, поскольку именно вы сохранили данные, вы должны знать тип данных. Таким образом, при чтении данных вы можете использовать соответствующие функции преобразования, чтобы получить нужный тип данных.