2012-10-24 2 views
4

У меня есть ситуация, когда у меня есть объект класса на C++, который должен быть отправлен через границы процесса (процесс 1 для обработки 2) с использованием Linux-труб. Я искал в Интернете, как сделать сериализацию в C++. Я нашел boost, но для этого требуются некоторые изменения в классе. В моей ситуации я не могу изменить класс.Отправить глубокую копию объекта через границу процесса в C++

Этот класс имеет много указателей, а вложенность продолжается до 3 уровней (класс 1 имеет указатель 1 типа Class 2-> Класс 2 имеет указатель 2 типа Class 3 -> Класс 3 имеет указатель 3 типа type 4 -> Класс 4). Есть ли способ отправить этот объект с помощью труб, чтобы он мог быть воссоздан во втором процессе?

Спасибо.

+2

«В моей ситуации я не могу изменить объявление класса ... ...? Или вы даже не можете изменить реализацию? Нереально предлагать общее решение для сериализации, используя только общедоступные методы класса. –

+0

@BrianCain Я не могу изменить реализацию класса – Jake

+1

Разве это не причина того, почему XML были изобретены? И если вам не нравится XML, попробуйте JSON? –

ответ

2

Вам нужно как-то сериализовать класс. Как именно ваш выбор, но вы можете сделать это в формате, таком как JSON, или XML, или какой-то бинарный формат, который вы решаете. Не видя никаких подробностей о вашем классе, добавить еще нечего.

Другим вариантом может быть использование сегментов Shared memory для хранения класса, но это связано с проблемами с математикой, параллелизмом и другими сложностями указателя.

1

Вы считаете заявку Memento pattern? Вы можете создать класс или классы для обработки подробностей о том, как сериализовать объект (либо в текстовом, либо в двоичном виде).

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

1

Вам понадобится сделать сериализацию, потому что вы не можете копировать конструкцию через трубу или что-то в этом роде. Если вы не можете изменить класс, тогда ваш единственный выбор - написать внешнюю функцию или класс, который использует открытый API класса верхнего уровня, чтобы получить все части и сериализовать эти данные. Затем на другом конце вам придется восстановить его из потока.

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