Сериализация в памяти объекта с помощью C # - PullRequest
1 голос
/ 29 января 2009

У меня есть программа, которая берет код из файлов скриптов и компилирует его. И это прекрасно работает.

Проблема в том, что в скриптах я объявляю пару классов и хочу их сериализовать. Очевидно, что сериализатор C # (xml и бинарный) не любит сериализацию и десериализацию объекта, определенного в сборке в памяти.

Я предпочитаю не оставлять сборку в памяти, поэтому я ищу другой способ сериализации, но в случае, если возможно собрать сборку в памяти и в конечном итоге записать ее в файл?

Ответы [ 6 ]

1 голос
/ 29 января 2009

Вы всегда можете написать свою собственную функцию ToXml, используя отражение, чтобы записать данные вашего свойства в строку. Тогда ваш объект десериализуется сам.

Просто мысль.

0 голосов
/ 15 ноября 2011

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

Возможно, вам потребуется декорировать ваши динамические классы соответствующими атрибутами, в зависимости от того, что вы генерируете (например, производные классы), но не должно быть никаких проблем с использованием XmlSerializer в описанной вами ситуации.

Если бы вы могли публиковать подробности о проблемах, которые дает вам XmlSerializer, я могу помочь вам разобраться, в чем проблема.

Кроме того, я верю, что автогенерация кода - это вообще благословение. Мне часто приходилось возвращаться в класс, чтобы исправить одну или все функции копирования / вставки / сохранения / загрузки, просто потому, что кто-то забыл обновить их при добавлении новой переменной. Код сохранения / загрузки является кодом пластины котла. Пусть компьютеры напишут это.

0 голосов
/ 29 января 2009

Посмотрите здесь для пользовательских сериализаторов, которые являются примером для XML-сериализации словаря

0 голосов
/ 29 января 2009

Я бы по возможности избегал всех встроенных сериализаций, оба сильно сломаны. Например, сериализация XML не поддерживает словари, а обычная сериализация / SOAP не поддерживает генерики. И у обоих есть проблемы с версиями.

Это отнимает много времени, но создание методов ToXML и FromXML, вероятно, является наиболее эффективным способом.

0 голосов
/ 29 января 2009

Итак, чтобы уточнить, вы спрашиваете, как можно сериализовать тип, если к нему не применен атрибут [Serializable]?

Одним из решений является использование сериализатора контракта данных WCF: http://msdn.microsoft.com/en-us/library/ms731923.aspx.

Очевидно, это будет работать, только если вы можете использовать таргетинг на .Net 3.0 или выше.

Также вы можете реализовать ISerializationSurrogate. У Джеффри Рихтера прекрасное вступление на http://msdn.microsoft.com/en-us/magazine/cc188950.aspx.

0 голосов
/ 29 января 2009

Если вы хотите создавать сборки динамически, посмотрите на излучение IL через отражение. Вот хорошая статья для начала.

...