Вопрос

В настоящее время я переделываю приложение и обнаружил проблему с сериализацией некоторых данных.

Допустим, у меня есть массив размером mxn

double **data;

который я хочу сериализовать в

char *dataSerialized

с использованием простых разделителей (один для строк, один для элементов).

Десериализация довольно проста, она подсчитывает разделители и выделяет размер для хранения данных. Однако насчет функции сериализации, скажем,

serialize_matrix(double **data, int m, int n, char **dataSerialized);

Какой была бы наилучшая стратегия для определения размера, необходимого для массива char, и выделения для него соответствующей памяти?

Возможно, использовать экспоненциальное представление чисел типа double с фиксированной шириной в строке? Можно ли просто преобразовать все байты double в char и получить выровненный массив char sizeof (double)? Как сохранить точность чисел?

ПРИМЕЧАНИЕ.

Мне нужны данные в массиве символов, а не в двоичном формате и не в файле.

Сериализованные данные будут отправлены по сети с использованием ZeroMQ между сервером C и клиентом Java. Возможно ли, учитывая размеры массива и sizeof (double), что он всегда может быть точно реконструирован между этими двумя?

Это было полезно?

Решение

В Java есть неплохая поддержка чтения необработанных байтов и преобразования во все, что вы хотите. Вы можете выбрать простой проводной формат, а затем сериализовать его в C и десериализовать в Java.

Вот пример чрезвычайно простого формата с кодом для десериализации и сериализации.

Я написал немного более крупную тестовую программу, которую я могу скопировать куда-нибудь, если хотите;он создает массив случайных данных на C, сериализует, записывает сериализованную строку в кодировке base64 в стандартный вывод.Затем гораздо меньшая java-программа считывает, декодирует и десериализует это.

Код C для сериализации:

родовое слово

Код Java для десериализации:

родовое слово

Другие советы

Если вы пишете двоичный файл, вам следует подумать о хорошем способе сериализации фактических двоичных данных (64-битных) вашего генерируемого кода.Это может перейти от прямой записи содержимого двойника в файл (с учетом порядка байтов) к более сложным схемам нормализации сериализации (например, с четко определенным представлением NaN).Это действительно ваше дело.Если вы ожидаете в основном однородной архитектуры, вероятно, будет достаточно прямого дампа памяти.

Если вы хотите записать в текстовый файл и ищете представление ASCII, я бы категорически не рекомендовал использовать десятичное числовое представление.Вместо этого вы можете преобразовать 64-битные необработанные данные в ASCII, используя base64 или что-то в этом роде.

Вы действительно хотите сохранить точность, присущую генеральному кодированию кода!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top