“未标记为可序列化”的问题

三碗猪脚 2016-04-15 05:57:05
求教大侠:
我想在用户页面存储 User 对象,页面级的变量,我想存在viewstate中,但是提示 反序列化错误,
于是将User类定义中增加了 [Serializable]
实际上所有的类定义中都增加了 [Serializable] 标记
但是由于使用了LINQ TO SQL
页面还是发生了错误 :

程序集“System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中的类型“System.Data.Linq.EntityRef`1[[EightEdu.Entity.User, EightEdu.Entity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]”未标记为可序列化。

堆栈跟踪:

[SerializationException: 程序集“System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中的类型“System.Data.Linq.EntityRef`1[[EightEdu.Entity.User, EightEdu.Entity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]”未标记为可序列化。]
System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type) +11488965
System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context) +258
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +161
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) +182
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo) +419
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +446
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) +131
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph) +17
System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter writer, Object value) +2826

[ArgumentException: 序列化类型“EightEdu.Entity.VerifyInfo”的值“EightEdu.Entity.VerifyInfo”时出错。]
System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter writer, Object value) +3499
System.Web.UI.ObjectStateFormatter.Serialize(Stream outputStream, Object stateGraph) +144
System.Web.UI.ObjectStateFormatter.Serialize(Object stateGraph, Purpose purpose) +71
System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter2.Serialize(Object state, Purpose purpose) +13
System.Web.UI.Util.SerializeWithAssert(IStateFormatter2 formatter, Object stateGraph, Purpose purpose) +40
System.Web.UI.HiddenFieldPageStatePersister.Save() +106
System.Web.UI.Page.SavePageStateToPersistenceMedium(Object state) +108
System.Web.UI.Page.SaveAllState() +606
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1139


其中 VerifyInfo是User的子类
在VerifyInfo有如下定义



/// <summary>
/// 关联父类:用户
/// 关联父类或者一对一子类
/// </summary>
private EntityRef<User> _User = new EntityRef<User>();
/// <summary>
/// 关联父类:用户
/// </summary>
[global::System.Data.Linq.Mapping.AssociationAttribute(Name="User_VerifyInfo", Storage="_User", ThisKey="userId", OtherKey="id", IsForeignKey=true)]
public User User
{
get
{
return this._User.Entity;
}
set
{
User previousValue = this._User.Entity;
if (((previousValue != value)
|| (this._User.HasLoadedOrAssignedValue == false)))
{
this.SendPropertyChanging();
if ((previousValue != null))
{
this._User.Entity = null;
//若是一对一子类,则SetNull,若是父类则Remove
previousValue.VerifyInfo.Remove(this);
}
this._User.Entity = value;
if ((value != null))
{
value.VerifyInfo.Add(this);
this._userId = value.id;
}
else
{
this._userId = default(int);
}
this.SendPropertyChanged("User");
}
}
}



在User类有如下定义


/// <summary>
/// 关联子类:验证信息
/// 一对多 关联子类
/// </summary>
private EntitySet<VerifyInfo> _VerifyInfo = new EntitySet<VerifyInfo>();
/// <summary>
/// 关联子类:验证信息
/// 一对多 关联子类
/// </summary>
[global::System.Data.Linq.Mapping.AssociationAttribute(Name="User_VerifyInfo", Storage="_VerifyInfo", ThisKey="id", OtherKey="userId")]
public EntitySet<VerifyInfo> VerifyInfo
{
get
{
return this._VerifyInfo;
}
set
{
this._VerifyInfo.Assign(value);
}
}


参考帖子:http://bbs.csdn.net/topics/300073755


或者有没有其它 的办法 在页面存储复杂的对象,除了viewstaste
...全文
1546 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
三碗猪脚 2016-04-16
  • 打赏
  • 举报
回复
但是hiddenFied只以存字符串,并不能存对象
  • 打赏
  • 举报
回复
viewstate只是当前页面有效,session是在访问周期内有效,所以是放session里面的 至于那个提示就是加个[Serializable]的事情,不过一般来说应该是定义个贫血模型来作为要放入session的对象载体
BitCoffee 2016-04-15
  • 打赏
  • 举报
回复
引用 2 楼 rovecat 的回复:
我对大哥的敬仰之情犹如涛涛江水,说真的,发自肺腑! 因为我并计算机专业科班出身,完全是自习的,所以有很多的问题,也可能会犯很低级的错误,大哥见笑了,多谢大哥批评指教, 感谢在这么早的时间内回复这么多的内容,非常感射。非常钦佩您的职业精神和操守! 这个问题我本身的相法是这样的: 我对于每个页面继承自一下页面基类 BasePage 在这个基类中定义了一个User对象,保存了User的一些属性, 因为在不同的页面需要调用User的不同属性,为了避免反复的去查询数库User的属性,同时希望给服务器形成最小的负担, 所以想用ViewsState或者Session,我的理解也不太深刻或到位,可能存在者乱用的情况。 再次感谢您的指导~
你这个一般用Session保存的。 Session["User"] = User的实体对象; 其他页面调用时: User user = (User)Session["User"];
正怒月神 版主 2016-04-15
  • 打赏
  • 举报
回复
不能存在session里吗?你的user对象不就是应该存在session里的吗
三碗猪脚 2016-04-15
  • 打赏
  • 举报
回复
我对大哥的敬仰之情犹如涛涛江水,说真的,发自肺腑! 因为我并计算机专业科班出身,完全是自习的,所以有很多的问题,也可能会犯很低级的错误,大哥见笑了,多谢大哥批评指教, 感谢在这么早的时间内回复这么多的内容,非常感射。非常钦佩您的职业精神和操守! 这个问题我本身的相法是这样的: 我对于每个页面继承自一下页面基类 BasePage 在这个基类中定义了一个User对象,保存了User的一些属性, 因为在不同的页面需要调用User的不同属性,为了避免反复的去查询数库User的属性,同时希望给服务器形成最小的负担, 所以想用ViewsState或者Session,我的理解也不太深刻或到位,可能存在者乱用的情况。 再次感谢您的指导~
  • 打赏
  • 举报
回复
你保存的对象不支持序列化,那么你就算是写上 [Serializable] 标记也不多是一个标题党。标题党的结果,虽然在编译时混过去了,不过就是推迟到运行时才在用户面前让软件崩溃,这还不如在编译期就检查出来问题、不允许编译通过呢! 首先要搞明白的问题就是:是否有必要在viewstate中保存你的这个User的问题。ViewState是有代价的,是在客户端跟服务器端来回反复地拷贝的,你应该尽可能地把它放在服务器端的文件、数据库中(然后使用HttpRuntime.Cache进行数据缓存),宁可反复读取后台资源也不通过网线跟千里之外的浏览器去反复拷贝。判断你的 User 是否应该包括那么多东西,是否是 User 类型应该拆开成为简单的东西,只把最简的部分放到ViewState中(甚至只把一个记录的 ID 主键值放到 ViewState 中就够了)。这个方面,不要以“编程简单”为原则,而要以深入一点的经验再来看到底什么设计方式才最终是简单的。 其次,那些具有纯粹服务器端操作的对象,本身就是不能反序列化的。比如说在服务器端的控件要维系它的宿主控件树的联系,服务器端的复杂 EF 对象要维系它的宿主 DataContext 的联系,这些都不能在反序列化时重建出来,因此必定会失败。只有很简单的数据实体才能反序列化,要避免滥用序列化/反序列化的思路。你给别人一个包子,别人见到的就是这个包子而已。如果你要求别人从一个包子就看到你这边蒸包子的所有机制,那就是错误的想法。 因此在使用序列化/反序列化时,你应该把复杂对象中的纯粹“数值”部分抽出来放到一个单纯的实体对象中进行传输,而从简单实体对象再重建复杂对象的功能,需要你自己设计开发。
BitCoffee 2016-04-15
  • 打赏
  • 举报
回复
引用 8 楼 rovecat 的回复:
[quote=引用 7 楼 BitCoffee 的回复:] [quote=引用 6 楼 rovecat 的回复:] 多谢楼的兄弟,我现在知道了 Session可以保存对象,以前我以为只可以保存基本数据类型。 我的问题还有种情况 页面后能两个函数都需要要使用到User的实例,那User对象如何保存呢,不想到数据库去查询,同时减少到数据库的压力, cookies不能保存对象吧,用static型就变成了全局的了,多人登录都是一样的结果。 当本页面关闭时,这个变量就没有用了 不知道该如何实现
后面的页面直接用啊。用的时候判断下Session["User"] != null[/quote] 我上一帖意思是,这个变量只是要页面中存在,相当于页面的全局变量(但每个用户不一样),方便于在不同的函数中调用,不想用session,因为它可以跨页面传值,ViewSatat可以实现,但对于我上面的对象,行不通 还有一个是不是HidenFiled?[/quote] 恩,可以用HidenFiled
三碗猪脚 2016-04-15
  • 打赏
  • 举报
回复
引用 7 楼 BitCoffee 的回复:
[quote=引用 6 楼 rovecat 的回复:] 多谢楼的兄弟,我现在知道了 Session可以保存对象,以前我以为只可以保存基本数据类型。 我的问题还有种情况 页面后能两个函数都需要要使用到User的实例,那User对象如何保存呢,不想到数据库去查询,同时减少到数据库的压力, cookies不能保存对象吧,用static型就变成了全局的了,多人登录都是一样的结果。 当本页面关闭时,这个变量就没有用了 不知道该如何实现
后面的页面直接用啊。用的时候判断下Session["User"] != null[/quote] 我上一帖意思是,这个变量只是要页面中存在,相当于页面的全局变量(但每个用户不一样),方便于在不同的函数中调用,不想用session,因为它可以跨页面传值,ViewSatat可以实现,但对于我上面的对象,行不通 还有一个是不是HidenFiled?
BitCoffee 2016-04-15
  • 打赏
  • 举报
回复
引用 6 楼 rovecat 的回复:
多谢楼的兄弟,我现在知道了 Session可以保存对象,以前我以为只可以保存基本数据类型。 我的问题还有种情况 页面后能两个函数都需要要使用到User的实例,那User对象如何保存呢,不想到数据库去查询,同时减少到数据库的压力, cookies不能保存对象吧,用static型就变成了全局的了,多人登录都是一样的结果。 当本页面关闭时,这个变量就没有用了 不知道该如何实现
后面的页面直接用啊。用的时候判断下Session["User"] != null
三碗猪脚 2016-04-15
  • 打赏
  • 举报
回复
多谢楼的兄弟,我现在知道了 Session可以保存对象,以前我以为只可以保存基本数据类型。 我的问题还有种情况 页面后能两个函数都需要要使用到User的实例,那User对象如何保存呢,不想到数据库去查询,同时减少到数据库的压力, cookies不能保存对象吧,用static型就变成了全局的了,多人登录都是一样的结果。 当本页面关闭时,这个变量就没有用了 不知道该如何实现

62,272

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧