Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8285035
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 8, 20262026-06-08T11:19:39+00:00 2026-06-08T11:19:39+00:00

I use in my application a kind of session-per-conversation pattern implementation. In this approach

  • 0

I use in my application a kind of “session-per-conversation” pattern implementation.
In this approach the “NHibernate Session” is kept on the “HTTP Session”. In every “Http Request” the “NHibernate Session” is reconnected at the beginning and disconnected at the end of the request. The “NHibernate Session” is kept in “HTTP Session” by the end of the “conversation”. This is working very well.

The Problem:

Now I’m considering using “StateServer mode” on the “Http Session”.
Thus, all objects in the “HTTP Session” must be serializable, including the “NHibernate Session”.

So I’m doing a proof of concept to validate that the serialization/deserialization of a “NHibernate Session” and its cached objects works.

The “proof of concept” is the following unit test. And the goal is to make it pass.

Code:

/*069*/  [Test]
/*070*/  public void Test()
/*071*/  {
/*072*/      //for inspecting the SQL commands
/*073*/      NhSqlLogCapture hhSqlLogCapture = new NhSqlLogCapture();
/*074*/  
/*075*/      MemoryStream ms = new MemoryStream();
/*076*/  
/*077*/      ISession sessionBefore = null;
/*078*/      ISession sessionAfter = null;
/*079*/  
/*080*/      //querying before the serialization.
/*081*/      try
/*082*/      {
/*083*/          sessionBefore = this.sessionFactory.OpenSession();
/*084*/          sessionBefore.FlushMode = FlushMode.Auto;
/*085*/  
/*086*/          hhSqlLogCapture.Enable();
/*087*/  
/*088*/          //Querying only 'DetailEtt'
/*089*/          hhSqlLogCapture.SqlStatments.Clear();
/*090*/          ICriteria crt = sessionBefore.CreateCriteria<DetailEtt>();
/*091*/          crt
/*092*/              .SetFetchMode("Master", FetchMode.Select);
/*093*/          IList<DetailEtt> cen1DetailList = crt.List<DetailEtt>();
/*094*/  
/*095*/          //BEGIN: Serializing
/*096*/          //also serializing an instance of 'DetailEtt' to verify that keeps only one instance to the same database record.
/*097*/          sessionBefore.Disconnect();
/*098*/          Object[] serializationArray = new object[] { sessionBefore, sessionBefore.Get<DetailEtt>(1) };
/*099*/          BinaryFormatter bf = new BinaryFormatter();
/*100*/          bf.Serialize(ms, serializationArray);
/*101*/          //END: Serializing
/*102*/  
/*103*/          //assertions
/*104*/          //Checking the sql command executed.
/*105*/          Assert.AreEqual(1, hhSqlLogCapture.SqlStatments.Count, "hhSqlLogCapture.SqlStatments.Count");
/*106*/          Regex rx = new Regex("(?is).*SELECT.*FROM.*DETAIL.*");
/*107*/          Assert.IsTrue(rx.IsMatch(hhSqlLogCapture.SqlStatments[0]), hhSqlLogCapture.SqlStatments[0]);
/*108*/  
/*109*/          hhSqlLogCapture.Disable();
/*110*/      }
/*111*/      finally
/*112*/      {
/*113*/          sessionBefore = null;
/*114*/      }
/*115*/  
/*116*/      try
/*117*/      {
/*118*/          //BEGIN: Deserializing
/*119*/          BinaryFormatter bf = new BinaryFormatter();
/*120*/          ms.Seek(0, SeekOrigin.Begin);
/*121*/          Object[] deserializationArray = (Object[])bf.Deserialize(ms);
/*122*/          DetailEtt dtEttDeserialized = (DetailEtt)deserializationArray[1];
/*123*/          sessionAfter = (ISession)deserializationArray[0];
/*124*/          //BEGIN: Deserializing
/*125*/  
/*126*/          IDbConnection conn = this.dbProvider.CreateConnection();
/*127*/          conn.Open();
/*128*/          sessionAfter.Reconnect(conn);
/*129*/  
/*130*/          //Enabling again because the session loses the reference to the log (I think).
/*131*/          hhSqlLogCapture.Enable();
/*132*/          hhSqlLogCapture.SqlStatments.Clear();
/*133*/  
/*134*/          DetailEtt dtEtdSSGet = sessionAfter.Get<DetailEtt>(1);
/*135*/          MasterEtt mtEtd = dtEtdSSGet.Master;
/*136*/          Console.WriteLine(mtEtd.Description);
/*137*/  
/*138*/          //assertions
/*139*/          //Checking the sql command executed.
/*140*/          Assert.AreEqual(1, hhSqlLogCapture.SqlStatments.Count, "hhSqlLogCapture.SqlStatments.Count");
/*141*/          Regex rx = new Regex("(?is).*SELECT.*FROM.*MASTER.*");
/*142*/          Assert.IsTrue(rx.IsMatch(hhSqlLogCapture.SqlStatments[0]), hhSqlLogCapture.SqlStatments[0]);
/*143*/          //verify that keeps only one instance to the same database record
/*144*/          Assert.AreSame(dtEttDeserialized, dtEtdSSGet, "verify that keeps only one instance to the same database record");
/*145*/      }
/*146*/      finally
/*147*/      {
/*148*/          sessionAfter.Close();
/*149*/      }
/*150*/  }

The test passes on almost everything. But it fails when tries to load an entity that is “Lazy”.

The error:

SofPOC.Questions.SerializeSession.SerializeSessionTest.Test:
  NHibernate.LazyInitializationException : Initializing[SofPOC.Questions.SerializeSession.Entities.MasterEtt#5]-Could not initialize proxy - no Session.    em NHibernate.Proxy.AbstractLazyInitializer.Initialize()
at NHibernate.Proxy.AbstractLazyInitializer.Initialize()
at Spring.Data.NHibernate.Bytecode.LazyInitializer.Invoke(IMethodInvocation invocation) in c:\_prj\spring-net\trunk\src\Spring\Spring.Data.NHibernate21\Data\NHibernate\Bytecode\LazyInitializer.cs:line 101
at Spring.Aop.Framework.AbstractMethodInvocation.Proceed() in c:\_prj\spring-net\trunk\src\Spring\Spring.Aop\Aop\Framework\AbstractMethodInvocation.cs:line 284
at Spring.Aop.Framework.DynamicProxy.AdvisedProxy.Invoke(Object proxy, Object target, Type targetType, MethodInfo targetMethod, MethodInfo proxyMethod, Object[] args, IList interceptors) in c:\_prj\spring-net\trunk\src\Spring\Spring.Aop\Aop\Framework\DynamicProxy\AdvisedProxy.cs:line 208
at DecoratorAopProxy_9872659265c04d36bc9738f2aaddfb08.get_Description()
at SofPOC.Questions.SerializeSession.SerializeSessionTest.Test() in C:\Users\hailtondecastro\lixo\stackoverflow\dotnet\StackoverflowNetPOCs_20120718\src\SofPOC.Net4.NH2.Spring13.2010\Questions\SerializeSession\SerializeSessionTest.cs:line 136

DetailEtt:

[Serializable]
public class DetailEtt
{
    private Int32? id;
    /// <summary>
    /// PK
    /// </summary>
    public virtual Int32? Id
    {
        get { return id; }
        set { id = value; }
    }

    private String description;
    /// <summary>
    /// TODO:
    /// </summary>
    public virtual String Description
    {
        get { return description; }
        set { description = value; }
    }

    private MasterEtt master;
    /// <summary>
    /// TODO:
    /// </summary>
    public virtual MasterEtt Master
    {
        get { return master; }
        set { master = value; }
    }
}

MasterEtt:

[Serializable]
public class MasterEtt
{
    private Int32? id;
    /// <summary>
    /// PK
    /// </summary>
    public virtual Int32? Id
    {
        get { return id; }
        set { id = value; }
    }

    private String description;
    /// <summary>
    /// TODO:
    /// </summary>
    public virtual String Description
    {
        get { return description; }
        set { description = value; }
    }
}

DetailEtt.hbm.xml:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="SofPOC.Questions.SerializeSession.Entities" assembly="SofPOC.Net4.NH2.Spring13">
  <class name="DetailEtt" table="DETAIL">
    <id name="Id" type="Int32">
      <column name="ID" sql-type="INTEGER"></column>
      <generator class="assigned"></generator>
    </id>
    <property name="Description" type="String">
      <column name="DESCRIPTION" sql-type="VARCHAR( 100 )"></column>
    </property>
    <many-to-one name="Master" fetch="select">
      <column name="MS_ID" sql-type="INTEGER"></column>
    </many-to-one>
  </class>
</hibernate-mapping>

MasterEtt.hbm.xml:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="SofPOC.Questions.SerializeSession.Entities" assembly="SofPOC.Net4.NH2.Spring13">
  <class name="MasterEtt" table="MASTER">
    <id name="Id" type="Int32">
      <column name="ID" sql-type="INTEGER"></column>
      <generator class="assigned"></generator>
    </id>
    <property name="Description" type="String">
      <column name="DESCRIPTION" sql-type="VARCHAR( 100 )"></column>
    </property>
  </class>
</hibernate-mapping>

The Question:

Even after reconnecting the deserialized “Hibernate Session” I get “Lazy Load Error”. How to avoid this kind of “Lazy Load Error” without having to reattach the entities?

I’m using:

  • Spring.Net 1.3.2
  • NHibernate 2.1.2
  • System.Data.SQLite 1.0.80.0

The complete source is here: Q11553780.7z

NOTES:

  • Before opening the solution (“.\ Src\SofPOC.2010.sln”) run “.\Dependencies\setup.bat” to load dependencies.
  • See “.\readme.txt” and “.\dependencies\readme.txt” for instructions about the dependencies.

EDITED:

I found that the cause of the problem is in the class NHibernate.Proxy.AbstractLazyInitializer of NHibernate. The field _session is marked as [NonSerialized]. This makes this field not be serialized. Consequently it is null after deserialization.

See the code:

namespace NHibernate.Proxy
{
    [Serializable]
    public abstract class AbstractLazyInitializer : ILazyInitializer
    {
        /// <summary>
        /// If this is returned by Invoke then the subclass needs to Invoke the
        /// method call against the object that is being proxied.
        /// </summary>
        protected static readonly object InvokeImplementation = new object();

        private object _target = null;
        private bool initialized;
        private object _id;
        [NonSerialized]
        private ISessionImplementor _session;
        ...

EDITED 2:

The cause of the problem is really the attribute [NonSerialized] because when I make the following “hack” the test passes. By Reflection, I make a change on the attributes of the “_session” from “Private | NotSerialized” to only “Private”.

The hack:

    protected override void OnSetUp()
    {
        //Hacking "_session"
        Type aliType = Type.GetType("NHibernate.Proxy.AbstractLazyInitializer, NHibernate");
        FieldInfo fiSession = aliType.GetField("_session", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        FieldInfo fi_m_fieldAttributes =
            fiSession.GetType().GetField(
                "m_fieldAttributes", 
                System.Reflection.BindingFlags.NonPublic 
                    | System.Reflection.BindingFlags.Instance);
        // changing it from "Private | NotSerialized" to only "Private"
        fi_m_fieldAttributes.SetValue(fiSession, FieldAttributes.Private);

        base.OnSetUp();
    }
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-08T11:19:42+00:00Added an answer on June 8, 2026 at 11:19 am

    As far as I can tell, there are three options to try:

    1. Use reflection to set the _session field with the deserialized session
    2. Open an new session an reattach them. This might be a pain to do, but I think that if the NHibernate team makes it difficult to do something, they probably have a good reason for it.
    3. Create your own ILazyInitializer. The ServerSide has an article about it here. I haven’t tried it myself.

    If you try nr 1, let us know if it works. I’m interested to see what happens. Theoretically it should work.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I just discovered that every request in an ASP.Net web application gets a Session
I have a Symfony application which use a mysql database to store session data,
I use application property to count number of online users: Application[OnlineUsers] = (int)Application[OnlineUsers] +
Is there another way to load MSHTML documents without use Application.ProcessMessages? To load a
I would like to know if is better to use application/javascript or application/ecmascript and
Can the application use set same char in the XON and XOFF? If yes,
we use an application that has an export to excel feature that doesn't work
i need to use my application class inside my thread which is started with
I am trying to use FIX::Application along with SessionSettings. The Fix server I am
can I change layout dpi that use my application on device? (on developed application

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.