Попробуйте это:
struct Example
{
int i;
char c;
char * text; // Prefer std::string to char *
void Serialize(std::ostream& output)
{
output << i << "\n";
output << c << "\n";
// Output the length of the text member,
// followed by the actual text.
size_t text_length = 0;
if (text)
(
text_length = strlen(text);
}
output << text_length << "\n";
output << text << "\n";
};
void Input(std::istream& input)
{
input >> i;
input.ignore(1000, '\n'); // Eat any characters after the integer.
input >> c;
input.ignore(1000, '\n');
// Read the size of the text data.
size_t text_length = 0;
input >> text_length;
input.ignore(1000, '\n');
delete[] text; // Destroy previous contents, if any.
text = NULL;
if (text_length)
{
text = new char[text_length];
input.read(text, text_length);
}
};
Поскольку указатели не являются переносимыми, вместо них должны быть записаны данные.
Текст известен как поле переменной длины . Поля переменной длины обычно выводятся (сериализуются) в двух структурах данных: длина, за которой следуют данные ИЛИ, за которыми следует символ терминала . Сначала указание длины позволяет использовать чтение блока . С последней структурой данных данные должны считываться по одной единице за раз, пока не будет прочитан символ терминала . Примечание: последняя структура данных также подразумевает, что символ терминала не может быть частью набора элементов данных.
Некоторые важные вопросы, которые следует учитывать при сериализации:
1. Используйте формат, который не зависит от платформы, например, текст ASCII для чисел.
2. Если метод платформы недоступен или не разрешен, определите для чисел точную спецификацию, включая Порядковый номер и максимальная длина .
3. Для чисел с плавающей запятой спецификация должна рассматривать компоненты числа с плавающей запятой как отдельные числа, которые должны соответствовать спецификации для числа (то есть экспоненты, величины и мантиссы).
4. Предпочитайте записи фиксированной длины записям переменной длины.
5. Предпочитаю сериализацию в буфер. Пользователи объекта могут затем создать буфер из одного или нескольких объектов и записать буфер как один блок (используя одну операцию). Аналогично для ввода.
6. Предпочитайте использовать базу данных для сериализации. Хотя это может быть невозможно для работы в сети, старайтесь изо всех сил иметь базу данных для управления данными. База данных может отправлять данные по сети.