我将会话存储在会话状态服务器上。 (将它存储在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在另一页上。
实际上有什么更好的解决方案?
答案 0 :(得分:2)
尝试在读取MemoryStream之前刷新JsonWriter:
...
ds.WriteObject(w, fi);
w.Flush();
ms3.Position = 0;
buf = ms.ToArray();
...