NHibernate序列化问题 - 类型'NHibernate.Cfg.Configuration'未标记为可序列化

时间:2010-11-17 10:34:23

标签: nhibernate serialization

我正在尝试通过序列化 NHibernate.Cfg.configuration 对象来改善使用NHibernate的C#Winforms应用程序的启动时间(如{{3所述]我尝试序列化时遇到以下错误:

  

System.Runtime.Serialization.SerializationException   :输入'NHibernate.Cfg.Configuration'   在装配'NHibernate,   版本= 1.2.1.4000,文化=中立,   PublicKeyToken = aa95f207798dfdb4'是   没有标记为可序列化。

提到这个问题的另一个stackoverflow帖子是http://msdn.microsoft.com/en-us/magazine/ee819139.aspx,但不幸的是,考虑到那里发布的评论,我仍然会遇到同样的错误。

NHibernate.Cfg.Configuration 对象的 ClassMappings Collection属性中包含的任何实体都没有引用 NHibernate.Cfg.Configuration 会话 SessionFactory 。实际上,包含这些实体的项目对于找到 NHibernateHelper 类的项目没有任何参考。

为了确保,我还使用 [Serializable] 属性标记了所有类,但这也没有帮助。

下面是我的 NHibernateHelper 类和NHibernate xml配置:

NHibernateHelper:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Context;

namespace PurchaseOrder.Data
{
    /// <summary>
    /// A helper class which provides NHibernate session objects on demand.
    /// The class creates a session factory only the first time a client needs a new session.
    /// </summary>
    public class NHibernateHelper
    {
        private static ISessionFactory _sessionFactory;
        private const string SerializedConfiguration = "configurtion.serialized";

        public static ISessionFactory SessionFactory{
            get{
                if (_sessionFactory == null){
                    var configuration = LoadConfigurationFromFile();

                    if (configuration == null){
                        configuration = new Configuration();
                        configuration.Configure();
                        SaveConfigurationToFile(configuration);
                    }

                    _sessionFactory = configuration.BuildSessionFactory();
                }
                return _sessionFactory;
            }
        }

        private static Configuration LoadConfigurationFromFile(){
            try{
                using (var file = File.Open(SerializedConfiguration, FileMode.Open)){
                    var bf = new BinaryFormatter();
                    return bf.Deserialize(file) as Configuration;
                }
            }
            catch (Exception ex){
                return null;
            }
        }

        private static void SaveConfigurationToFile(Configuration configuration){
            using (var file = File.Open(SerializedConfiguration, FileMode.Create)){
                var bf = new BinaryFormatter();
                bf.Serialize(file, configuration);
            }
        }

        public static ISession OpenSession(){
            return SessionFactory.OpenSession();
        }

        public static ISession GetCurrentSession(){
            return SessionFactory.GetCurrentSession();
        }
    }
}

NHibernate xml配置:

<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
    <session-factory>
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <property name="connection.connection_string">Server=<ServerName>;initial catalog=<DBName>;Integrated Security=SSPI</property>
        <property name="show_sql">true</property>
        <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
        <property name="current_session_context_class">thread_static</property>
        <mapping assembly="<AssemblyName>" />
    </session-factory>
</hibernate-configuration>

任何想法可能是什么问题?

由于

1 个答案:

答案 0 :(得分:3)

真正的问题是你正在使用NHibernate 1.2。它真的很旧(现在3岁),它没有可序列化的配置(code here)。

升级到NHibernate 2.1.2或更高版本3.0。