2009-09-05 3 views
8

Похоже, что .NET CF отсутствует очень полезный Reflection.Emit. До сих пор я нашел эту библиотеку в качестве альтернативы: http://www.codeplex.com/EmitCF.Альтернативы Reflection.Emit для Compact Framework

Однако, похоже, это заброшенная ранняя версия, поэтому я ищу дополнительные опции.

Кто-нибудь знает другую альтернативу Emit? Или, возможно, кто-то использовал EmitCF и может прокомментировать его статус?

Кстати, большая картина: Я пытаюсь получить Emit для CF, так что я могу получить http://dynamic.codeplex.com работать под CF, так что я могу оптимизировать код сериализации Я использую (http://www.codeproject.com/KB/XML/GR_CustomXmlSerializer.aspx)

+1

Является ли сериализация для XML строгим требованием? Если нет, вы можете посмотреть на двоичную сериализацию с чем-то вроде prot-buf. – ctacke

+0

Да, требуется сериализация на основе текста. Я нашел, что это единственный практический способ убедиться, что я могу легко переносить свои данные в новые версии своих программ. – Hermit

ответ

5

Вам нужна Cecil (http://mono-project.com/Cecil), монопроектная библиотека для создания и проверки программ и библиотек в формате CIL. Он активно поддерживается, делает намного больше, чем Reflection.Emit, и он используется во многих проектах, в том числе в некоторых из них. NET CF.

+0

EmitCF основан на Cecil ... Я поближе посмотрю на Сесила, но это хорошая идея. Самая новая версия Сесила, которую я могу найти, составляет 0,6, с 2007 года. Есть ли новые? – Hermit

+0

С тех пор Cecil был перенесен в ядро ​​Mono, поэтому последние версии распространяются вместе с библиотеками классов Mono. Источник находится по адресу http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/Mono.Cecil/, и если вы загрузите Mono, будет включен Mono.Cecil.dll. –

1

Это не совсем ответ на ваш вопрос, но поскольку Reflection.Emit не поддерживается в CF, альтернативный подход, который вы могли бы предпринять для сериализации/десериализации, состоял в том, чтобы скомпилировать ваши классы в обычное приложение Windows и используйте Reflection.Emit, чтобы программно генерировать методы сериализации и де-сериализации для каждого класса, которые затем могут быть включены обратно в класс в версии CF. В принципе, вы должны использовать Reflection.Emit в полной структуре для генерации кода.

Это будет больше работы (и, конечно, постоянным источником дополнительной работы), но он будет работать лучше, чем динамический подход Reflection.Emit (который в любом случае не работает в CF). Большинство классов CF будут работать без изменений в полной структуре, хотя и не обязательно, конечно.

+0

Отличная идея, это сделает идеальное решение, если оно будет работать :-) Я не уверен, как это реализовать. Не могли бы вы рассказать о том, как включить методы обратно в класс? Также вы знаете какие-либо проекты, используя эту технику, которую я мог бы использовать в качестве примера? – Hermit

+0

Поразмыслив немного, я понял, что вам не придется делать то, что я предлагал вообще. Я предлагал генератор кода, который просто перебирал все поля и свойства (используя Type.GetFields и Type.GetProperties) и создавал настраиваемые методы Serialize и Deserialize, которые вы затем копировали и вставляли обратно в исходный класс. Как оказалось, вам не нужно использовать Reflection.Emit для этого, поэтому нет причин, по которым вы не могли бы просто выполнять эту итерацию динамически в пользовательских методах Serialize и Deserialize в вашем классе CF. – MusiGenesis

+0

Вы даже можете написать общий класс с помощью статических методов Serialize и Deserialize, которые принимают объект как параметр и возвращают сериализованный материал (для Serialize) или который берет сериализованную часть и возвращает объект (для десериализации). GetFields и GetProperties (наряду с полями FieldInfo и PropertyInfo) доступны в пользовательской структуре.Вы даже можете сериализовать XML или массив byte [], как вам нравится, но поскольку вы хотите обрабатывать будущие изменения в классах, я думаю, что XML был бы способом. – MusiGenesis

 Смежные вопросы

  • Нет связанных вопросов^_^