Asp.net IDataReader序列化错误
我有一个ASP.NET页面,其中包含一个Asp.net IDataReader序列化错误,asp.net,serialization,idatareader,Asp.net,Serialization,Idatareader,我有一个ASP.NET页面,其中包含一个Gridview 我正在尝试将IDataReader对象绑定到网格。这个IDataReader对象是通过调用更多的代码层(实际上是形成控制器层和DB层的其他.ent项目DLL)来分配的,然后最终绑定到我的网格 在gridview1.Datasource=dr(dr是我的IDataReader),我看不出有任何问题 但在gridview1.Databind行,我得到一个异常,异常对象中的详细信息如下: {“类型”System.Data.Common.DbEn
Gridview
我正在尝试将IDataReader
对象绑定到网格。这个IDataReader
对象是通过调用更多的代码层(实际上是形成控制器层和DB层的其他.ent项目DLL)来分配的,然后最终绑定到我的网格
在gridview1.Datasource=dr
(dr是我的IDataReader),我看不出有任何问题
但在gridview1.Databind行,我得到一个异常,异常对象中的详细信息如下:
{“类型”System.Data.Common.DbEnumerator'在程序集'System.Data,版本=2.0.0.0,区域性=neutral,PublicKeyToken=b77a5c561934e089'中未标记为可序列化。“}
我不确定申请表中出了什么问题。有什么想法或意见吗
编辑1
添加stacktrace异常:
Server stack trace:
at System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
at System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter)
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
at System.Runtime.Remoting.Channels.CoreChannel.SerializeBinaryMessage(IMessage msg, Stream outputStream, Boolean includeVersions)
at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.SerializeResponse(IServerResponseChannelSinkStack sinkStack, IMessage msg, ITransportHeaders& headers, Stream& stream)
at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at System.Collections.IEnumerable.GetEnumerator()
at System.Collections.IEnumerable.GetEnumerator()
at System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding)
at System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data)
at System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable data)
at System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data)
at System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback)
at System.Web.UI.WebControls.DataBoundControl.PerformSelect()
at System.Web.UI.WebControls.BaseDataBoundControl.DataBind()
at System.Web.UI.WebControls.GridView.DataBind()
at Drive.CampaignManager.CreateQuery.GridViewBind()
in Mycode.aspx.cs
服务器堆栈跟踪:
at System.Runtime.Serialization.FormatterServices.InternalGetSerializationMembers(RuntimeType类型)
at System.Runtime.Serialization.FormatterServices.GetSerializableMembers(类型,StreamingContext上下文)
在System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()中
在System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(对象obj、ISurrogateSelector代理选择器、StreamingContext上下文、SeroObjectInfo初始化SeroObjectInfo初始化、FormatterConverter转换器、ObjectWriter ObjectWriter)
在System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serializate(对象obj、ISurrogateSelector代理选择器、StreamingContext上下文、SeroObjectInfo init SeroObjectInfo init、FormatterConverter转换器、ObjectWriter ObjectWriter)
在System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serializate(对象图,头[]inHeaders,\uu BinaryWriter serWriter,布尔fCheck)
在System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serializate(流序列化流,对象图,头[]头,布尔fCheck)
at System.Runtime.Remoting.Channels.CoreChannel.SerializeBinaryMessage(IMessage msg、Stream outputStream、Boolean includeVersions)
在System.Runtime.Remoting.Channels.BinaryServerFormatterSink.SerializeResponse(IServerResponseChannelSinkStack,IMessage msg,ITransportHeaders&headers,Stream&Stream)
在System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack、IMessage requestMsg、ITransportHeaders requestHeaders、Stream requestStream、IMessage&responseMsg、ITransportHeaders&responseHeaders、Stream&responseStream)
在[0]处重试异常:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)
at System.Runtime.Remoting.proxy.RealProxy.PrivateInvoke(MessageData&msgData,Int32类型)
位于System.Collections.IEnumerable.GetEnumerator()处
位于System.Collections.IEnumerable.GetEnumerator()处
位于System.Web.UI.WebControl.GridView.CreateChildControls(IEnumerable数据源,布尔数据绑定)
位于System.Web.UI.WebControl.CompositeDataBoundControl.PerformDataBinding(IEnumerable数据)
位于System.Web.UI.WebControl.GridView.PerformDataBinding(IEnumerable数据)
在System.Web.UI.WebControl.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.activitmanager.CreateQuery.GridViewBind()中
在Mycode.aspx.cs中
无法从上面的堆栈跟踪中了解太多信息。查看异常的堆栈跟踪。它将向您显示什么代码试图序列化
DbEnumerator
从读取您发布的堆栈跟踪中,看起来您的层之间正在进行远程处理-此代码是否在多台计算机上运行?不能跨远程边界传递不可序列化的类,如DataReader(SqlDataReader、EntityDataReader等)(如果您在美国:-),也可以序列化)
您需要一种不同的设计来实现这一点,一种在代码层之间传递可序列化对象的设计。传递数据集可能是使UI代码工作的最简单的方法,因为您只需替换
gridview1.Datasource = dr
与
菲尔:我能从你说的话中理解一些东西。在我的web解决方案中,控制器层和数据访问层是独立的项目。但是数据访问层正在调用一些与框架相关的对象(由某人编写)及其方法。我对这个框架不太了解,因为我们提供一些输入,比如表名或id,然后它获取输出。因此,我仅怀疑该区域,该层返回的IDataReader是否完全不可序列化。我需要仔细研究一下。我想一下。谢谢你的评论。你的猜测是正确的。它的远程处理。我的数据阅读器实际上是从dataaccesslayer返回datareader,dataaccesslayer实际上位于不同的域中,或者说它在我的应用程序边界之外。所以我得到了序列化错误。感谢您为我提供了检查问题的正确方向。现在,我将datareader加载到一个带有数据访问层的表中,并在我的应用程序中使用datatable,这非常有效。谢谢,这是公认的答案:)
gridview1.DataSource = ds