2010-04-08 4 views
0

У меня есть устаревшее приложение, которое, кажется, экспортирует/сохраняет файлы с помощью CArchive (устаревшее приложение MFC).Разборные классы CArchive (классы MFC) в Ruby

В настоящее время мы реорганизуем инструмент для Интернета. Есть ли библиотека, которую я могу посмотреть в Ruby для разбора и загрузки этих устаревших файлов?

Какие возможные библиотеки я мог бы изучить?

Проблема с форматом файл по XML serialization for MFC включает в себя: негрубость -Ваш программы сбоя, если вы читаете архив, полученный с помощью другой версии программы. Этого можно избежать с помощью сложного и нестандартного управления версиями. Используя XML, этого можно избежать. - Тяжелые зависимости между вашей программной объектной моделью и заархивированными данными. Измените модель программы, и почти невозможно прочитать данные из предыдущей версии. - Невозможно отредактировать архивные данные, за исключением связанного с ним приложения.

Также - существует 4 версии устаревшего программного обеспечения, как бы я мог преодолеть эту ObjectModel, проблему архивных данных для разных версий? Требуются общие возможности возврата (импорта).

ответ

2

У CArchive нет формата, который вы можете проанализировать. Это всего лишь двоичный файл. Вы должны знать, что в нем знать, как читать. Библиотека может облегчить чтение некоторых типов данных (CString, CArray и т. Д.), Но я не уверен, что вы найдете что-нибудь подобное.

CArchive как это работает (хранящая часть):

CArchive ar; 
int i = 5; 
float f = 5.42f; 
CString str("string"); 
ar << i << f << str; 

Тогда все это сваливается в двоичный файл. Вам придется читать двоичные данные и как-то интерпретировать их. Это легко в C++, потому что MFC знает, как сериализовать типы, включая сложные типы, такие как CString и CArray. Но вам придется делать это самостоятельно, используя Ruby.

Например, вы можете прочитать 4 байта (потому что вы знаете, что int - это большой) и интерпретировать его как целое. Следующие четыре байта для float. И тогда вы должны увидеть, как загрузить CString, он сохраняет длину сначала, а затем данные, но вам нужно взглянуть на точный формат, который он использует. Вы можете создавать функции утилиты для каждого типа, чтобы сделать вашу жизнь проще, но не ожидайте, что это будет просто.

+0

Итак, CArchive - это просто двоичное пространство для сериализованных типов данных? – EarlyPoster

+0

У меня есть весь код для более старых версий программного обеспечения. Я могу получить типы данных и т. Д. Все еще, как я буду открывать старые файлы с этими знаниями? – EarlyPoster

+0

Итак, я должен знать, во-первых, структуру и формат. Благодарю. – EarlyPoster

1

Вы можете написать экспортера в C++, используя старую функциональность, которая будет считываться в CArchive, а затем выводить XML-файл или что-то из содержимого. Чтение CArchives прямо из Ruby (или любого другого языка, кроме C++/MFC), станет крупным проектом. Может быть, вам это удастся, если записанные данные - это всего лишь структура с несколькими ints или longs, но как только ваш CArchive содержит UDT, вы находитесь в мире боли. Например, я даже не думаю, что CArchive дает обещания по выравниванию.

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