【问题标题】:Object not serializable对象不可序列化
【发布时间】:2013-03-22 07:15:05
【问题描述】:

我在asp.net 中有一个文件上传控件,用于上传图片。我想在asp.net 的image 控件中显示预览图像。这是aspx代码

ASPX

<script type="text/javascript">

    function FU_Img_onchange(oFU_Img) {
        alert("sak");
        var img = document.getElementById("<%= Btn_Preview.ClientID%>");
        img.click();

    }
    function FU_Video_onchange(oFU_Vid) {
        var vid = document.getElementById("<%= VidPreview.ClientID %>");
        vid.click();
    }
</script>


背后的 C# 代码

 protected void Btn_Preview_Click(object sender, EventArgs e)
        {
            try
            {
                if (FU_Img.HasFile)
                {
                    string path = Server.MapPath("/TempImages");


                    FileInfo oFileInfo = new FileInfo(FU_Img.PostedFile.FileName);
                    string fileName = oFileInfo.Name;

                    string fullFileName = path + "//" + fileName;
                    string imagePath = "/TempImages/" + fileName;

                    if (!Directory.Exists(path))
                    {
                        Directory.CreateDirectory(path);
                    }
                    Session["FileUpload"] = FU_Img;
                    FU_Img.PostedFile.SaveAs(fullFileName);
                    Img_Prof.ImageUrl = imagePath;
                }
            }
            catch (Exception ex)
            {
                using (StreamWriter sw = new StreamWriter("/log.txt"))
                {
                    sw.NewLine = DateTime.Now.ToString() + "--->>" + ex.ToString() + "\n" + ex.StackTrace.ToString();
                }
            }
        }

如您所见,我将图像控件置于会话中。它在开发服务器上运行良好。当我将网站发布到域时,我遇到了问题

Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.

堆栈跟踪

[SerializationException: Type 'System.Web.UI.WebControls.FileUpload' in Assembly 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.]
   System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type) +7738443
   System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context) +258
   System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +111
   System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter) +422
   System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter) +51
   System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +410
   System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) +134
   System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1577

[HttpException (0x80004005): Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.]
   System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1662
   System.Web.SessionState.SessionStateItemCollection.WriteValueToStreamWithAssert(Object value, BinaryWriter writer) +34
   System.Web.SessionState.SessionStateItemCollection.Serialize(BinaryWriter writer) +606
   System.Web.SessionState.SessionStateUtility.Serialize(SessionStateStoreData item, Stream stream) +239
   System.Web.SessionState.SessionStateUtility.SerializeStoreData(SessionStateStoreData item, Int32 initialStreamSize, Byte[]& buf, Int32& length) +72
   System.Web.SessionState.OutOfProcSessionStateStore.SetAndReleaseItemExclusive(HttpContext context, String id, SessionStateStoreData item, Object lockId, Boolean newItem) +87
   System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs) +560
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75`

我确信文件上传控制和会话有问题。但是请指导正确的方向我该怎么办? 提前谢谢

【问题讨论】:

  • 堆栈跟踪和消息清楚地说明了问题:您正在使用 StateServer 或数据库来存储会话数据,这意味着它必须被序列化才能存储在任一位置。您尝试插入会话的 FileUpload 控件不可序列化,因此失败。

标签: c# asp.net session serialization


【解决方案1】:

通过查看异常,可能是 SessionMode 设置为 SQLServer 或 StateServer ,将其更改为 InProc 并查看其是否有效。如果它有效,则意味着您在后端存储中的会话持久性不起作用,因此请检查一下或发布代码,以便我们可以深入了解该问题。

【讨论】:

  • 我的web.config 中没有像&lt;sessionState /&gt; 这样的东西,默认情况下它可能是StateServer 或SQLServer。我把它改成InProc。它对我有用。
  • @SaghirA.Khatri:一个 Khatri,如果它有效并且你需要它作为 InProc,而不是接受答案:)
  • 会话持久性是什么意思。请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
相关资源
最近更新 更多