【问题标题】:Serialization of Strongly Typed Datasets强类型数据集的序列化
【发布时间】:2012-02-24 22:24:33
【问题描述】:

有没有人知道一种方法可以使强类型数据集(嘿,我不想使用它们)可序列化,以便我可以使用 AppFabric Server 作为会话状态提供程序来存储它们?我已经使用 InProc Session 状态一段时间了,对此没有任何问题。一旦我将会话状态移到 AppFabric 服务器,我就会遇到一些强类型数据集的问题。我不断收到错误消息,告诉我我的数据集不可序列化。我已经检查过了,它们上面有 Serializable 属性,它们只包含可序列化的数据类型(int、string 等)有什么想法吗?

编辑:这是堆栈跟踪:

System.Runtime.Serialization.SerializationException: The constructor to deserialize an object of type ''DataSetClasses.MyStronglyTypedDataset'' was not found. ---> System.Runtime.Serialization.SerializationException: The constructor to deserialize an object of type ''DataSetClasses.MyStronglyTypedDataset'' was not found. at System.Runtime.Serialization.ObjectManager.GetConstructor(RuntimeType t, RuntimeType[] ctorParams) at System.Runtime.Serialization.ObjectManager.CompleteISerializableObject(Object obj, SerializationInfo info, StreamingContext context) --- End of inner exception stack trace --- at System.Runtime.Serialization.ObjectManager.CompleteISerializableObject(Object obj, SerializationInfo info, StreamingContext context) at System.Runtime.Serialization.ObjectManager.FixupSpecialObject(ObjectHolder holder) at System.Runtime.Serialization.ObjectManager.DoFixups() at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) at System.Web.Util.AltSerialization.ReadValueFromStream(BinaryReader reader) at System.Web.SessionState.SessionStateItemCollection.ReadValueFromStreamWithAssert() at System.Web.SessionState.SessionStateItemCollection.DeserializeItem(String name, Boolean check) at System.Web.SessionState.SessionStateItemCollection.get_Item(String name) at System.Web.SessionState.HttpSessionStateContainer.get_Item(String name) at System.Web.SessionState.HttpSessionState.get_Item(String name) at appt.T2SharedLibrarySetup.btnSave_Click(Object sender, EventArgs e) in D:\Application\ProblemFile.aspx.vb:line 331 at System.Web.UI.WebControls.Button.OnClick(EventArgs e) at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) at System.Web.UI.Page.RaisePostBackEvent

【问题讨论】:

标签: asp.net .net vb.net appfabric


【解决方案1】:

先尝试将对象序列化/反序列化为字节数组,然后再尝试将其放入会话(然后再放入 AppFabric)。这是一个例子。

        private static BinaryFormatter formatter = null;

    private static Byte[] Serialize(object entity)
    {
        Logger.LogDebug(Category.Cache, "Serializing");
        Byte[] bytes;
        if (formatter == null) formatter = new BinaryFormatter();
        using (MemoryStream stream = new MemoryStream())
        {
            formatter.Serialize(stream, entity);
            bytes = stream.ToArray();
        }
        return bytes;
    }

    private static object DeSerialize(Byte[] bytes)
    {
        #region Sanitation
        if (bytes == null) { throw new System.ArgumentNullException("bytes"); }
        #endregion
        Logger.LogDebug(Category.Cache, "DeSerializing");
        object obj;
        if (formatter == null) formatter = new BinaryFormatter();
        using (MemoryStream stream = new MemoryStream(bytes))
        {
            obj = formatter.Deserialize(stream);
        }
        return obj;
    }

在您从反序列化器中取回对象后,尝试将其转换回您的类型化数据集类型。

【讨论】:

  • 这是在 Visual Studio 中通过添加数据集然后将表/存储过程拖放到设计图面上创建的强类型数据集。我应该需要手动序列化/反序列化这个内置的 Visual Studio 功能,这似乎违反直觉。
  • 我建议这样做的原因是,如果您自己对其进行二进制序列化,您将消除对 appfabric 客户端检查您的对象并试图弄清楚如何自行序列化它的依赖。例如,如果客户端在您的类的任何成员上发现 WCF 数据注释属性,它将尝试使用您可能不想使用的 NetDataContractSerializer。
【解决方案2】:

您可以使用 DataSet.ReadXML() 或 WriteXML() 函数来实现所需的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2018-08-05
    • 2021-02-06
    • 1970-01-01
    相关资源
    最近更新 更多