Я использовал следующие сборки для подключения кэширования 2-го уровня NHibernate с Enyim Memcached с использованием двоичного сериализатора Protobuf-net:
- NHibernate
- NHibernate.Caches.EnyimMemcached
- Enyim.Caching
- protobuf-net
- protobuf-net.Enyim
Недавно я обратил внимание на то, что, несмотря на подключение protobuf-net к EnyimMemcached, я, скорее всего, на самом деле не использую этот сериализатор, поскольку все мои объекты были отмечены только [Serializable]
и ни [DataContract]
, ни [ProtoContract]
с соответствующими упорядоченными данными / ProtoMembers для свойств. Я могу заставить protobuf-net работать с EnyimMemcached, когда я взаимодействую с memcache непосредственно после добавления соответствующих атрибутов (или регистрирую их вручную с помощью класса RuntimeTypeModel.Default для protobuf-net).
Однако, даже если я проведу должную осмотрительность при регистрации моих типов с помощью protobuf-net, я не думаю, что любая запись в кеше, поступающая из NHibernate, на самом деле будет сериализована protobuf-net, потому что NHibernate.Caches.EnyimMemcached хранит записи в кеше внутри DictionaryEntry
объектов:
bool returnOk = client.Store(
StoreMode.Set, KeyAsString(key),
new DictionaryEntry(GetAlternateKeyHash(key), value),
TimeSpan.FromSeconds(expiry));
DictionaryEntry
не имеет атрибутов [DataContract]
и [DataMember(Order = xx)]
. Это заставляет меня задуматься ...
Могу ли я даже правильно использовать сериализатор protobuf-net для кэширования 2-го уровня NHibernate?