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]
我不确定是否完全理解。。。您试图序列化一个不可序列化的类,并且想知道为什么