我正在尝试通过序列化 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>
任何想法可能是什么问题?
由于
答案 0 :(得分:3)
真正的问题是你正在使用NHibernate 1.2。它真的很旧(现在3岁),它没有可序列化的配置(code here)。
升级到NHibernate 2.1.2或更高版本3.0。