Сериализация для memcached - PullRequest
       11

Сериализация для memcached

2 голосов
/ 01 апреля 2010

У меня есть этот огромный объект домена (скажем, родитель), который содержит другие объекты домена. Требуется много времени, чтобы «создать» этот родительский объект путем запроса к БД (хорошо, мы оптимизируем БД). Поэтому мы решили кешировать его, используя memcached (точнее, с northscale )

Итак, я просмотрел свой код и пометил все классы (я думаю) как [Serializable], но когда я добавляю его в кеш, в моем окне вывода VS.net выдается исключение сериализации.

var cache = new NorthScaleClient("MyBucket");
cache.Store(StoreMode.Set, key, value);

Это исключение:

A first chance exception of type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dll

ТАК, я думаю, я не пометил все классы как [Serializable]. Я не использую сторонние библиотеки и могу пометить любой класс как [Serializable], но как мне определить, какой класс не работает, когда кэш пытается сериализовать объект?

Edit1: комментарии casperOne заставляют меня задуматься. Я смог кешировать эти доменные объекты с помощью Microsoft Cache Application Block, не отмечая их [Serializable], но не с помощью memcached в NorthScale. Это заставляет меня думать, что, возможно, что-то связано с их реализацией, но просто из любопытства я по-прежнему заинтересован в том, чтобы найти причину ошибки при попытке добавить объект в memcached

Ответы [ 3 ]

2 голосов
/ 01 апреля 2010

Общее упущение с BinaryFormatter - это события; если у вас есть подписанные объекты, которые не сериализуемые, случается плохое. Кроме того, вы, вероятно, не имеете в виду для сериализации подписчиков. Вы можете пометить их как [NonSerialized] или [field:NonSerialized].

Если ничего не помогает, присвойте ему byte[] вашего объекта (или, если это не получится, base64). Тем не менее, я бы посоветовал против BinaryFormatter здесь - это хрупкий и занимает больше пропускной способности, чем нужно. У меня был некоторый успех с использованием protobuf-net ( см. Здесь , но другая реализация); который на меньше, быстрее и версия безопасна. Я мог бы помочь подправить это для вас? Или вы можете использовать хук ISerializable от protobuf-net.

1 голос
/ 05 апреля 2010

Вот так я и решил. NorthScale не выдавал никаких ошибок при сбое сериализации. Я сериализовал свой доменный объект с помощью двоичной сериализации и смог выяснить, какие классы не работают (поскольку они не были помечены как [Serializable]). Исправил и все заработало

Видя результаты protobuf-net, я тоже думаю о переключении моего сериализатора

1 голос
/ 01 апреля 2010

Перейдите в меню «Отладка -> Исключения» и разверните «Исключения времени выполнения на общем языке», затем выберите соответствующее пространство имен для SerializationException (System.Runtime.Serialization) и проверьте разрыв при возникновении исключения для SerializationException.

Таким образом, вы можете проверить детали выданного исключения.

Также обратите внимание, что исключение из первого шанса не обязательно означает, что существует проблема с кодом приложения.

...