C# 标记为NonSerializedAttribute的成员上System.Web.UI.Page.SaveAllState()的序列化异常
我在包含自定义控件的页面上遇到序列化错误。该控件有一个成员(C# 标记为NonSerializedAttribute的成员上System.Web.UI.Page.SaveAllState()的序列化异常,c#,.net,asp.net,serialization,C#,.net,Asp.net,Serialization,我在包含自定义控件的页面上遇到序列化错误。该控件有一个成员(dataContext),其类型(EntityContext)是不可序列化的,并被标记为不可序列化的 这就是错误: 在中键入“Entities.EntityContext” 程序集“…”未标记为 可序列化 [序列化异常:类型] “…实体。EntityContext” 在程序集中,“…”是 未标记为可序列化。] System.Runtime.Serialization.FormatterServices.InternalGetSerial
dataContext
),其类型(EntityContext
)是不可序列化的,并被标记为不可序列化的
这就是错误:
在中键入“Entities.EntityContext”
程序集“…”未标记为
可序列化
[序列化异常:类型]
“…实体。EntityContext”
在程序集中,“…”是
未标记为可序列化。]System.Runtime.Serialization.FormatterServices.InternalGetSerializationMembers(RuntimeType 类型)+7733643
System.Runtime.Serialization.FormatterServices.GetSerializationMembers(类型 类型,StreamingContext)+258
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +111 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerializate(对象 obj,ISurrogateSelector 代理选择程序,StreamingContext 上下文,SeroObjectInfoinit 血清目标信息素 转换器,ObjectWriter(ObjectWriter) +161 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serializate(对象 obj,ISurrogateSelector 代理选择程序,StreamingContext 上下文,SeroObjectInfoinit 血清目标信息素 转换器,ObjectWriter(ObjectWriter) +51 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serializate(对象 图表,标题[]吸入装置, __二进制编写器serWriter,布尔fCheck)+410
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serializate(流 序列化流、对象图、, 标题[]标题,布尔fCheck)+134 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serializate(流 序列化流,对象图)+13 System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter 写入器,对象值)+4966 [ArgumentException:序列化时出错 价值 “…实体。EntityContext” 类型 “…Entities.EntityContext.” System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter 写入器,对象值)+5425
System.Web.UI.ObjectStateFormatter.Serialize(流 outputStream,对象状态图)+163 System.Web.UI.ObjectStateFormatter.Serialize(对象 状态图)+99
System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Serialize(对象 州)+37
System.Web.UI.Util.SerializeWithAssert(IStateFormatter 格式化程序,对象状态图)+55
System.Web.UI.HiddenFieldPageStatePersister.Save() +143 System.Web.UI.Page.SavePageStateToPersistenceMedium(对象 州)+190
System.Web.UI.Page.SaveAllState() +1466 System.Web.UI.Page.ProcessRequestMain(布尔值 includeStagesBeforeAsyncPoint,布尔值 includeStagesAfterAsyncPoint)+5477 这是控件:
public class EntityDataSource : ObjectDataSource
{
[NonSerialized] private EntityContext dataContext;
/// <summary>
/// Gets the data context. (This is used by the page at runtime.)
/// </summary>
/// <value>The data context.</value>
// ReSharper disable MemberCanBePrivate.Global
public EntityContext DataContext
// ReSharper restore MemberCanBePrivate.Global
{
get { return dataContext; }
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
dataContext = new EntityContext(SessionProvider.GetContext());
}
/// <summary>
/// Viewstate is not implemented. This value allways return <c>false</c>.
/// </summary>
/// <exception cref="NotSupportedException">Exception is thrown when setting this value.</exception>
[Browsable(false)]
public override bool EnableViewState
{
get
{
return false;
}
set
{
//Throws exception if value is true.
if (value)
{
throw new NotSupportedException("Viewstate is not enabled on this control.");
}
}
}
public override void Dispose()
{
if (DataContext != null)
{
DataContext.Dispose();
}
base.Dispose();
}
}
公共类EntityDataSource:ObjectDataSource
{
[非序列化]私有EntityContext数据上下文;
///
///获取数据上下文。(页面在运行时使用此上下文。)
///
///数据上下文。
//ReSharper disable MemberCanBePrivate.Global
公共EntityContext数据上下文
//ReSharper restore MemberCanBePrivate.Global
{
获取{return dataContext;}
}
受保护的覆盖无效加载(事件参数e)
{
基础荷载(e);
dataContext=newEntityContext(SessionProvider.GetContext());
}
///
///未实现Viewstate。此值始终返回false。
///
///设置此值时引发异常。
[可浏览(错误)]
公共覆盖布尔启用视图状态
{
得到
{
返回false;
}
设置
{
//如果值为true,则引发异常。
如果(值)
{
抛出新的NotSupportedException(“此控件上未启用Viewstate”);
}
}
}
公共覆盖无效处置()
{
if(DataContext!=null)
{
Dispose();
}
base.Dispose();
}
}
页面似乎不支持非序列化数据属性
。
我已经从名称空间中省略了公司和产品名称。您是否也尝试在属性上添加[NonSerialized]属性?
此外,如果您在类中使用的任何类型(在示例中可能已忽略)继承自EntityContext,那么您就有麻烦了 确保将
SerializableAttribute
添加到EntityDataSource
类:
[Serializable]
public class EntityDataSource : ObjectDataSource
{
[NonSerialized] private EntityContext dataContext;
// etc...
}
如果类未标记为[Serializable]
,则将忽略[NonSerialized]
属性
系统是否能够真正序列化您希望它序列化的类是另一回事。控件上是否还有其他未显示的内容?特别地;您继承自
ObjectDataSource
——我假设您在某个时候为它提供了数据上下文(或某些相关对象)
我个人并不期望ObjectDataSource
应该序列化。对于初学者来说,它既不是可i序列化的
也不是可[Serializable]
。此外,它还有很多活动。。。而且事件很少是序列化的朋友(至少在使用BinaryFormatter时是这样)
最后,您应该序列化状态;但是ObjectDataSource
不是state,它(或多或少)是UI实现的一部分。仅仅尝试序列化一个普通的ObjectDataSource
就足以引起异常
简言之;我认为您不应该将此控件包括在
SaveAllState
的范围内,或者将控件的字段标记为[NonSerialized]
我不确定是否完全理解。。。您试图序列化一个不可序列化的类,并且想知道为什么