diff --git a/src/NHibernate.Test/Async/CacheTest/SerializationFixture.cs b/src/NHibernate.Test/Async/CacheTest/SerializationFixture.cs
new file mode 100644
index 00000000000..274dc727bbf
--- /dev/null
+++ b/src/NHibernate.Test/Async/CacheTest/SerializationFixture.cs
@@ -0,0 +1,377 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by AsyncGenerator.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
+using System.Text;
+using System.Xml;
+using System.Xml.Linq;
+using NHibernate.Cache;
+using NHibernate.Cache.Entry;
+using NHibernate.Engine;
+using NHibernate.Intercept;
+using NHibernate.Properties;
+using NHibernate.Type;
+using NSubstitute;
+using NUnit.Framework;
+
+namespace NHibernate.Test.CacheTest
+{
+ using System.Threading.Tasks;
+ [TestFixture]
+ public class SerializationFixtureAsync
+ {
+ private static readonly List KnownTypes = new List
+ {
+ typeof(AnyType.ObjectTypeCacheEntry),
+ typeof(DateTimeOffset),
+ typeof(TimeSpan),
+ typeof(UnfetchedLazyProperty),
+ typeof(UnknownBackrefProperty),
+ typeof(object[]),
+ typeof(CacheEntry),
+ typeof(CacheLock),
+ typeof(CachedItem),
+ typeof(CollectionCacheEntry)
+ };
+
+ [Test]
+ public async Task TestCacheEntrySerializationAsync()
+ {
+ var item = CreateCacheEntry();
+ var copy = await (TestDataContractSerializerAsync(item));
+ CheckCacheEntry(item, copy);
+
+ copy = TestBinaryFormatter(item);
+ CheckCacheEntry(item, copy);
+ }
+
+ [Test]
+ public async Task TestCollectionCacheEntrySerializationAsync()
+ {
+ var item = CreateCollectionCacheEntry();
+ var copy = await (TestDataContractSerializerAsync(item));
+ CheckCollectionCacheEntry(item, copy);
+
+ copy = TestBinaryFormatter(item);
+ CheckCollectionCacheEntry(item, copy);
+ }
+
+ [Test]
+ public async Task TestCachedItemSerializationAsync()
+ {
+ // CacheEntry
+ var item = CreateCachedItem(CreateCacheEntry());
+ var copy = await (TestDataContractSerializerAsync(item));
+ CheckCachedItem(item, copy);
+
+ copy = TestBinaryFormatter(item);
+ CheckCachedItem(item, copy);
+
+ // CollectionCacheEntry
+ item = CreateCachedItem(CreateCollectionCacheEntry());
+ copy = await (TestDataContractSerializerAsync(item));
+ CheckCachedItem(item, copy);
+
+ copy = TestBinaryFormatter(item);
+ CheckCachedItem(item, copy);
+ }
+
+ [Test]
+ public async Task TestCacheLockSerializationAsync()
+ {
+ var item = new CacheLock
+ {
+ Version = 3.5m,
+ Id = 100,
+ Timeout = 999,
+ UnlockTimestamp = 444,
+ Multiplicity = 5,
+ WasLockedConcurrently = false
+ };
+ var copy = await (TestDataContractSerializerAsync(item));
+ CheckCacheLock(item, copy);
+
+ copy = TestBinaryFormatter(item);
+ CheckCacheLock(item, copy);
+ }
+
+ [Test]
+ public async Task TestAnyTypeObjectTypeCacheEntrySerializationAsync()
+ {
+ var item = CreateObjectTypeCacheEntry();
+ var copy = await (TestDataContractSerializerAsync(item));
+ CheckObjectTypeCacheEntry(item, copy);
+
+ copy = TestBinaryFormatter(item);
+ CheckObjectTypeCacheEntry(item, copy);
+ }
+
+
+ [Serializable]
+ public class MyEntity
+ {
+ public int Id { get; set; }
+ }
+
+ private CachedItem CreateCachedItem(object value)
+ {
+ return new CachedItem
+ {
+ Version = 55L,
+ Value = value,
+ FreshTimestamp = 500
+ };
+ }
+
+ private CacheEntry CreateCacheEntry()
+ {
+ return new CacheEntry
+ {
+ DisassembledState = GetAllKnownTypeValues(),
+ Version = 55,
+ Subclass = "Test",
+ AreLazyPropertiesUnfetched = true
+ };
+ }
+
+ private CollectionCacheEntry CreateCollectionCacheEntry()
+ {
+ return new CollectionCacheEntry
+ {
+ State = GetAllKnownTypeValues()
+ };
+ }
+
+ private object[] GetAllKnownTypeValues()
+ {
+ var entityName = nameof(MyEntity);
+ var xmlDoc = new XmlDocument();
+ xmlDoc.LoadXml("XmlDoc");
+ var types = new Dictionary
+ {
+ {NHibernateUtil.AnsiString, "test"},
+ {NHibernateUtil.Binary, new byte[] {1, 2, 3, 4}},
+ {NHibernateUtil.BinaryBlob, new byte[] {1, 2, 3, 4}},
+ {NHibernateUtil.Boolean, true},
+ {NHibernateUtil.Byte, (byte) 1},
+ {NHibernateUtil.Character, 'a'},
+ {NHibernateUtil.CultureInfo, CultureInfo.CurrentCulture},
+ {NHibernateUtil.DateTime, DateTime.Now},
+ {NHibernateUtil.DateTimeNoMs, DateTime.Now},
+ {NHibernateUtil.LocalDateTime, DateTime.Now},
+ {NHibernateUtil.UtcDateTime, DateTime.UtcNow},
+ {NHibernateUtil.LocalDateTimeNoMs, DateTime.Now},
+ {NHibernateUtil.UtcDateTimeNoMs, DateTime.UtcNow},
+ {NHibernateUtil.DateTimeOffset, DateTimeOffset.Now},
+ {NHibernateUtil.Date, DateTime.Today},
+ {NHibernateUtil.Decimal, 2.5m},
+ {NHibernateUtil.Double, 2.5d},
+ {NHibernateUtil.Currency, 2.5m},
+ {NHibernateUtil.Guid, Guid.NewGuid()},
+ {NHibernateUtil.Int16, (short) 1},
+ {NHibernateUtil.Int32, 3},
+ {NHibernateUtil.Int64, 3L},
+ {NHibernateUtil.SByte, (sbyte) 1},
+ {NHibernateUtil.UInt16, (ushort) 1},
+ {NHibernateUtil.UInt32, (uint) 1},
+ {NHibernateUtil.UInt64, (ulong) 1},
+ {NHibernateUtil.Single, 1.1f},
+ {NHibernateUtil.String, "test"},
+ {NHibernateUtil.StringClob, "test"},
+ {NHibernateUtil.Time, DateTime.Now},
+ {NHibernateUtil.Ticks, DateTime.Now},
+ {NHibernateUtil.TimeAsTimeSpan, TimeSpan.FromMilliseconds(15)},
+ {NHibernateUtil.TimeSpan, TimeSpan.FromMilliseconds(1234)},
+ {NHibernateUtil.DbTimestamp, DateTime.Now},
+ {NHibernateUtil.TrueFalse, false},
+ {NHibernateUtil.YesNo, true},
+ {NHibernateUtil.Class, typeof(IType)},
+ {NHibernateUtil.ClassMetaType, entityName},
+ {NHibernateUtil.Serializable, new MyEntity {Id = 1}},
+ {NHibernateUtil.Object, new MyEntity {Id = 10}},
+ {NHibernateUtil.AnsiChar, 'a'},
+ {NHibernateUtil.XmlDoc, xmlDoc},
+ {NHibernateUtil.XDoc, XDocument.Parse("XDoc")},
+ {NHibernateUtil.Uri, new Uri("http://test.com")}
+ };
+
+ var sessionImpl = Substitute.For();
+ sessionImpl.BestGuessEntityName(Arg.Any