2010-11-17 57 views
2

我試圖提高使用NHibernate的一個C#WinForms應用程序的啓動時間(截至http://msdn.microsoft.com/en-us/magazine/ee819139.aspx描述的),但我得到以下錯誤,當我嘗試和連載:NHibernate的序列化問題 - 類型「NHibernate.Cfg.Configuration」不被<strong>序列化</strong>的<strong>NHibernate.Cfg.configuration</strong>對象標記爲可序列

System.Runtime.Serialization.SerializationException :鍵入「NHibernate.Cfg.Configuration」在大會「NHibernate的 , 版本= 1.2.1.4000,文化=中性, PublicKeyToken = aa95f207798dfdb4'是 未標記爲可序列化。

提到這個的另一個stackoverflow帖子是duplicate object graph and persist back as new in nhibernate,但不幸的是,考慮到張貼在那裏的意見,我仍然得到相同的錯誤。

被包括在ClassMappings集合屬性NHibernate.Cfg.Configuration對象的實體的任何一個都沒有到NHibernate.Cfg.Configuration任何參考或會話的SessionFactory。實際上,包含這些實體的項目對於找到我的類的項目沒有任何參考。

只是爲了確保,我也標誌着所有類與[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> 

任何想法可能是什麼伊斯蘭教UE?

謝謝

回答

3

真正的問題是你使用NHibernate 1.2。它真的很舊(現在3歲),它沒有可序列化配置(code here)。

升級到NHibernate 2.1.2或更好3.0。

+0

感謝Mauricio,這很好地糾正了這個問題! – Matthew 2010-11-17 14:44:36

相關問題