【问题标题】:IDataReader serialization errorIDataReader 序列化错误
【发布时间】:2012-08-03 10:48:25
【问题描述】:

我有一个包含Gridview 的 ASP.NET 页面。

我正在尝试将IDataReader 对象绑定到网格。这个IDataReader 对象是通过调用更多的代码层(实际上是形成控制器层和数据库层的其他.ent 项目dll)分配的,然后最终绑定到我的网格。

gridview1.Datasource = dr(dr 是我的 IDataReader),我没有发现任何问题。

但在 gridview1.Databind 行我得到一个异常,异常对象中的详细信息如下:

{“在程序集 'System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 中键入 'System.Data.Common.DbEnumerator' 未标记为可序列化。”}

我不确定应用程序出了什么问题。有什么想法或方法吗?

编辑 1

添加堆栈跟踪异常:

服务器堆栈跟踪: 在 System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType 类型) 在 System.Runtime.Serialization.FormatterServices.GetSerializableMembers(类型类型,StreamingContext 上下文) 在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() 在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(对象 obj,ISurrogateSelector surrogateSelector,StreamingContext 上下文,SerObjectInfoInit serObjectInfoInit,IFormatterConverter 转换器,ObjectWriter objectWriter) 在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(对象 obj,ISurrogateSelector surrogateSelector,StreamingContext 上下文,SerObjectInfoInit serObjectInfoInit,IFormatterConverter 转换器,ObjectWriter objectWriter) 在 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(对象图,Header[] inHeaders,__BinaryWriter serWriter,布尔 fCheck) 在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(流序列化流,对象图,标头 [] 标头,布尔 fCheck) 在 System.Runtime.Remoting.Channels.CoreChannel.SerializeBinaryMessage(IMessage 消息,流输出流,布尔包含版本) 在 System.Runtime.Remoting.Channels.BinaryServerFormatterSink.SerializeResponse(IServerResponseChannelSinkStack sinkStack,IMessage 消息,ITransportHeaders& 标头,Stream& 流) 在 System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack,IMessage requestMsg,ITransportHeaders requestHeaders,流 requestStream,IMessage& responseMsg,ITransportHeaders& responseHeaders,Stream& responseStream) 在 [0] 处重新抛出异常: 在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg) 在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData,Int32 类型) 在 System.Collections.IEnumerable.GetEnumerator() 在 System.Collections.IEnumerable.GetEnumerator() 在 System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable 数据源,布尔数据绑定) 在 System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable 数据) 在 System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable 数据) 在 System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable 数据) 在 System.Web.UI.DataSourceView.Select(DataSourceSelectArguments 参数,DataSourceViewSelectCallback 回调) 在 System.Web.UI.WebControls.DataBoundControl.PerformSelect() 在 System.Web.UI.WebControls.BaseDataBoundControl.DataBind() 在 System.Web.UI.WebControls.GridView.DataBind() 在 Drive.CampaignManager.CreateQuery.GridViewBind() 在 Mycode.aspx.cs

从上面的堆栈跟踪中无法理解太多。

【问题讨论】:

    标签: asp.net serialization idatareader


    【解决方案1】:

    通过阅读您发布的堆栈跟踪,您的层之间似乎有一些远程处理 - 此代码是否跨多台机器运行? DataReaders(SqlDataReader、EntityDataReader 等)等不可序列化的类(或 serializable,如果您在美国 :-))不能跨远程边界传递。

    您需要一种不同的设计来完成这项工作,一种在代码层之间传递可序列化对象的设计。传递 DataSet 可能是让你的 UI 代码正常工作的最低摩擦方法,因为你可以替换

    gridview1.Datasource = dr
    

    gridview1.DataSource = ds
    

    【讨论】:

    • phil 我可以从你所说的中理解一些事情。控制器层和数据访问层是我的 Web 解决方案中的独立项目。但是数据访问层正在调用一些与框架相关的对象(由某人编写)及其方法。我对框架了解不多,因为我们提供了一些输入,比如表名或 id,它会获取输出。所以我只怀疑那个区域,如果该层返回的 IDataReader 根本不是可序列化的。我需要挖掘这个。让我看看。感谢您的评论。
    • 你的猜测是正确的。它的远程处理。我的数据阅读器实际上是从数据访问层返回数据阅读器,它实际上位于不同的域中,或者说它在我的应用程序边界之外。所以我得到了那个序列化错误。感谢您给我正确的方向来检查问题。现在我正在将数据读取器加载到带有数据访问层的表中,并且我在我的应用程序中使用数据表,效果很好。谢谢,这是公认的答案:)
    【解决方案2】:

    查看异常的堆栈跟踪。它会告诉你什么代码试图序列化DbEnumerator

    【讨论】:

      猜你喜欢
      • 2014-02-19
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 2012-01-01
      • 2016-10-18
      相关资源
      最近更新 更多