Хранить объекты linq-to-sql в сеансе или альтернативное решение - PullRequest
2 голосов
/ 05 июля 2011

Я храню свою сессию на сервере состояний сессии.(Хранение в inproc не работает.)

Я пытаюсь использовать классы, сгенерированные linq-to-sql-дизайнером, встроенным в Visual Studio (2010), для хранения и представления некоторых данных вмой веб-сайт.

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

Проблема заключается в том, что когда я это делаю,Я получаю сообщение об ошибке, что некоторые части содержимого linq-to-sql не сериализуемы.

Я установил свой текстовый режим «режим сериализации» на «однонаправленный», что бы это ни значило.

ТогдаЯ создал некоторый альтернативный объект, который можно было бы лучше сериализовать, заменив некоторые поля sql-xmldata, которые были переведены в поля linq.xelement, базовой строкой, содержащей некоторое количество xml.В этом случае объекты содержат только базовые типы.

Все еще ошибки.

Затем я попытался с помощью DataContractJsonSerializer получить байт [], который я могу поместить в сеанс:

byte[] buf = null;
var ds = new DataContractJsonSerializer(fi.GetType());
using (var ms = new MemoryStream())
{
  using (var w = JsonReaderWriterFactory.CreateJsonWriter(ms))
  {
    ds.WriteObject(w, fi);
    ms3.Position = 0;
    buf = ms.ToArray();
  }
}
return buf;

Проблема здесь в том, что Json-строка, кажется, обрезана в середине некоторого элемента и поэтому не может быть десериализована впоследствии.Когда я попробовал использовать XmlWriter, у меня возникла проблема, заключающаяся в том, что он почему-то обрезал текст xml размером около 43000 байт.

Это оказывается довольно грязно.

Должно бытьлучший способ.

Одна идея, которую я получил, состояла в том, чтобы просто отправить объекты во временную таблицу сервера sql, получить guid из строки сервера sql, сохранить guid в сеансе вместо всего набора объектов,а затем перечитайте данные с сервера sql на другой странице.

Какое лучшее решение действительно работает?

1 Ответ

2 голосов
/ 05 июля 2011

Попробуйте очистить JsonWriter перед чтением MemoryStream:

...
ds.WriteObject(w, fi);
w.Flush();
ms3.Position = 0;
buf = ms.ToArray();
...
...