在会话或备用解决方案中存储linq-to-sql对象

时间:2011-07-05 13:30:21

标签: c# asp.net linq-to-sql session-state datacontractserializer

我将会话存储在会话状态服务器上。 (将它存储在proc中不起作用。)

我正在尝试使用visual studio(2010)内置的linq-to-sql-designer生成的类来存储和表示我网站中的一些数据。

在某些情况下,我想将一些对象放入会话中,以便能够在另一个网页上访问它们。

问题在于,当我这样做时,我得到一个错误,即linq-to-sql的某些部分是不可序列化的。

我已将我的datacontext“序列化模式”设置为“单向”,无论这意味着什么。

然后我创建了一个更好的序列化替代对象,用一个包含一些xml的基本字符串替换了一些转换为linq.xelement字段的sql-xmldata字段。然后,对象只包含基本类型。

仍然是错误。

然后我尝试使用DataContractJsonSerializer来获取我可以放入会话的byte []:

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-string似乎在某个元素的中间被切断,因此之后无法反序列化。当我尝试使用XmlWriter时,我遇到了一个问题,即出于某种原因,它会将xml文本切断为大约43000字节。

这结果非常混乱。

必须有更好的方法。

我得到的一个想法是简单地将对象提交到一些临时的sql server表,从sql server行获取guid,将guid存储在会话中而不是整个对象集中,然后重新读取来自sql server在另一页上。

实际上有什么更好的解决方案?

1 个答案:

答案 0 :(得分:2)

尝试在读取MemoryStream之前刷新JsonWriter:

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