"платформы, отличные от той, на которой исполняемый файл был скомпилирован"
Насколько отличается от того, на котором был скомпилирован исполняемый файл? Вам нужно поддерживать платформы, которые используют плавающие не IEEE? Платформы, которые используют символы не ASCII? Платформы, которые используют не 8-битные байты?
Если вы настаиваете на двоичном коде и настаиваете на том, чтобы сделать это самостоятельно, вероятно, лучше всего определить, что в формате хранения int
и long
будут храниться в виде последовательности из 4 байтов с прямым порядком байтов (или big-endian, но выберите один и придерживайтесь его независимо от платформы), содержащий ровно 8 значащих бит на байт. double
также будет двойным IEEE. Указатели вводят целый мир вреда, формат хранения должен прикреплять уникальный идентификатор к каждому экземпляру s1
, а затем указатель на s1
может быть сохранен как значение идентификатора и может быть найден как часть десериализации.
Различные платформы могут затем решить, какие типы они хотят использовать для каждого из типов хранилищ (так, например, если int
- это только 16 бит на данной платформе, ей просто нужно будет использовать long
для обоих * Типы 1014 * и long
. По этой причине вы должны указывать для них псевдонимы, относящиеся к конкретному домену). Помните, что невозможно избежать потери точности в двойных значениях при преобразовании в несовместимые представления и из них, поскольку они могут иметь разное количество значащих битов.
Для текста платформы без ASCII должны будут включать код для сериализации своего собственного текстового формата в ASCII и десериализации ASCII в нативный текст. Строго говоря, вам также следует избегать использования любых символов в тексте, которых нет в базовом наборе символов C, поскольку они могут вообще не быть отображаемыми на цели. Вы можете принять аналогичное решение, готовы ли вы рассчитывать на целевые платформы для поддержки Unicode каким-либо образом - если это так, то UTF-8 является разумным форматом обмена для текста.
Наконец, для каждой структуры на каждой платформе вы можете:
- написать (или, возможно, автоматически сгенерировать) код для его сериализации и код для его десериализации, или:
- сделайте себя предметно-ориентированным языком для определения структур и синтаксическим анализатором / интерпретатором, который сериализует и десериализует в соответствии с этим определением.
Звучит для меня как большая работа, чтобы сделать что-то, что было сделано раньше.