Кэширование AppFabric - каковы требования к сериализации и десериализации объекта?

Проблема: при кэшировании экземпляра класса и его немедленном извлечении из кеша я возвращаю объект (его не null), но все его свойства / поля имеют значение NULL или значения по умолчанию.

    _cacheHelper.PutInCache("testModuleControlInfoOne", mci);
    //mci has populated fields

    var mciFromCacheOne = _cacheHelper.GetFromCache("testModuleControlInfoOne");
    //mciFromCacheOne now has null or default fields

Поэтому я подозреваю, что проблема заключается в том, как структурирован объект, и по какой-то причине AppFabric не сериализует объект должным образом.

Однако, когда я использую следующий метод сериализации, я возвращаю объект со всеми свойствами / полями, как они были до сериализации.

    public T SerializeThenDeserialize<T>(T o) where T : class
    {
            BinaryFormatter bf = new BinaryFormatter();

            using (MemoryStream ms = new MemoryStream())
            {
                bf.Serialize(ms, o);

                ms.Position = 0;

                return (T)bf.Deserialize(ms);
            }
    }

Как можно правильно сериализовать и десериализовать объект, используя двоичный форматтер, и не делать то же самое при кэшировании?

Кто-нибудь сталкивался с этим или у кого-нибудь есть предложения или советы о том, на что в целом обращать внимание?


person CRice    schedule 17.09.2010    source источник
comment
Ответьте на аналогичный вопрос, размещенный здесь: stackoverflow.com/questions/3756480/   -  person kenster    schedule 19.11.2011


Ответы (3)


Хорошо, нашел.

Объект реализовал IXmlSerializable, поэтому AppFabric использовал это вместо обычной сериализации.

Запуск его через XmlSerializer (вместо BinaryFormatter) дает те же пустые поля, что и я.

Похоже, у реализации IXmlSerializable есть проблемы.

person CRice    schedule 17.09.2010
comment
@andrewbadera - нет, под проблемами я имел в виду, что пользовательская реализация IXmlSerializable в классе плохо выполнялась разработчиком. - person CRice; 28.04.2011
comment
Кто-то хочет мне объяснить, в чем проблема? - person CRice; 26.06.2012
comment
Я не знаю, какие проблемы были с этим у других, но мне это помогло. У меня есть XElement, который, по иронии судьбы, не может обрабатывать обычная сериализация, поэтому я пытаюсь проверить, сможет ли он - это, по крайней мере, показывает мне, что он использует IXmlSerializable, а это все, что мне нужно было знать на данный момент :-) - person Simon_Weaver; 23.02.2013

Я считаю, что при сериализации в Xml (с использованием IXmlSerializable) частные поля объекта игнорируются, что может быть причиной того, что ваш объект был неполным при извлечении.

Использование двоичной сериализации гарантирует включение всего объекта (включая ссылки на другие объекты).

person ScottF    schedule 17.09.2010
comment
Хуже того, это класс в dll, который я не могу изменить с плохой реализацией IXmlSerializable. Знаете ли вы, можно ли настроить AppFabric для игнорирования IXmlSerializable и всегда использовать двоичную сериализацию? - person CRice; 21.09.2010

Вы можете посмотреть IDataCacheObjectSerializer

http://msdn.microsoft.com/en-us/library/windowsazure/hh552969.aspx

Кэширование AppFabric - Могу ли я указать стиль сериализации, используемый для все объекты?

(да, я понимаю, что этот вопрос тоже был ваш :-)

person Simon_Weaver    schedule 23.02.2013