Сериализация строго типизированных наборов данных - PullRequest
0 голосов
/ 25 февраля 2012

Кто-нибудь знает способ сериализации строго типизированных наборов данных (не моя идея их использовать), чтобы я мог хранить их, используя AppFabric Server в качестве поставщика состояния сеанса? Я использую состояние сеанса InProc уже некоторое время, и у меня не было никаких проблем с этим. Как только я переместил состояние сеанса на сервер приложений, у меня возникли проблемы со строго типизированными наборами данных. Я получаю сообщение об ошибке, сообщающее, что мои наборы данных не сериализуемы. Я проверил, и у них есть атрибут 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

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Попробуйте сериализовать / десериализовать объект в байтовый массив, прежде чем пытаться поместить его в сессию (а затем в 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;
    }

После того, как вы вернете объект из десериализатора, попытайтесь привести его обратно к типу набранного вами набора данных.

0 голосов
/ 09 апреля 2012

Вы можете использовать функции DataSet.ReadXML () или WriteXML () для достижения желаемой функциональности.

...