Добрый день.
Есть задача отправить по сети несколько структур. Есть низкоуровневые функции отправки long, short, double, char * и даже просто блока памяти. Проблема в том, что на клиентской машине и сервере разное физическое представление типа double. То есть отправить структуру просто по ее размеру блоком памяти не получается.
Есть ли способ при указанных ограничениях отправить все необходимые структуры как-то однотипно?
пока на ум приходит только отправка по полям. но 35 структур по 5 полей минимум — это ахтунг сколько копипастного бессмысленного кода.
Здравствуйте, 17dufa, Вы писали:
1>Добрый день. 1>Есть задача отправить по сети несколько структур. Есть низкоуровневые функции отправки long, short, double, char * и даже просто блока памяти. Проблема в том, что на клиентской машине и сервере разное физическое представление типа double. То есть отправить структуру просто по ее размеру блоком памяти не получается.
А часто и int имеет разное представление. я знаю как минимум 3 способа представления целого 4байтового. 1>Есть ли способ при указанных ограничениях отправить все необходимые структуры как-то однотипно?
да. например, завернуть все в xml или что то подобное. или protobuf от Google.
А можно просто найти найти такие "double", которые выглядят одинаково на обоих платформах, либо ввести свой тип — например предствлять вещественное в виде двух целых — мантиса и порядок.
Здравствуйте, 17dufa, Вы писали: 1>Есть ли способ при указанных ограничениях отправить все необходимые структуры как-то однотипно?
Используйте сериализацию в xml-строку (например boost::serialization), и гоняйте её туда-сюда, сериализуя и десериализуя свои структуры.
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
Здравствуйте, Rakafon, Вы писали: R>Используйте сериализацию в xml-строку (например boost::serialization), и гоняйте её туда-сюда, сериализуя и десериализуя свои структуры.
подтягивать весь boost ради одной сериализации — не вариант. Не объясните как работает boost::serialization? Зашоренные .Net Reflection мозги полностью отказываются понимать, как реализовывать подобное без .Net Reflection.
Здравствуйте, Rakafon, Вы писали: R>Используйте сериализацию в xml-строку (например boost::serialization), и гоняйте её туда-сюда, сериализуя и десериализуя свои структуры.
поднимать весь boost ради одной сериализации — не вариант. да к тому же как я вижу, все равно писать метод serialize. единственная радость, что вместо 2 методов отправки/приема достаточно будет одного.
все-таки хотелось бы функциональности .Net — поставил атрибут [Serializable] и усе, дальше компилятор и среда работают, программист отдыхает.
Здравствуйте, 17dufa, Вы писали:
1>подтягивать весь boost ради одной сериализации — не вариант.
Ну отправляйте любым/своим текстовым протоколом и отпадут проблемы представления простых типов. Если не хочется делать это вручную, использовать какой-нить ORM, или написать свою, простейшую сериализацию.
1> Не объясните как работает boost::serialization?
Для каждой структуры пишется функция, отвечающая за сериализацию этой структуры. Потом она вызывается Там по документации всё понятно, читайте
1>Зашоренные .Net Reflection мозги полностью отказываются понимать, как реализовывать подобное без .Net Reflection.
Вручную.
1>Есть задача отправить по сети несколько структур. Есть низкоуровневые функции отправки long, short, double, char * и даже просто блока памяти. Проблема в том, что на клиентской машине и сервере разное физическое представление типа double. То есть отправить структуру просто по ее размеру блоком памяти не получается. 1>Есть ли способ при указанных ограничениях отправить все необходимые структуры как-то однотипно? 1>пока на ум приходит только отправка по полям. но 35 структур по 5 полей минимум — это ахтунг сколько копипастного бессмысленного кода.
Прикрутить генерацию этого кода по хидеру и прописать в makefile правило для апдейта сгенеренных исходников?
Здравствуйте, 17dufa, Вы писали: 1>поднимать весь boost ради одной сериализации — не вариант. да к тому же как я вижу, все равно писать метод serialize. единственная радость, что вместо 2 методов отправки/приема достаточно будет одного.
Ежели не хотите затягивать весь boost, можете выковырять оттуда лишь boost::serialization, вопользовавшись утилитой BCP.
1>все-таки хотелось бы функциональности .Net — поставил атрибут [Serializable] и усе, дальше компилятор и среда работают, программист отдыхает. :beer:
Welcome to real world, Neo!
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
17dufa пишет:
> Добрый день. > Есть задача отправить по сети несколько структур. Есть низкоуровневые > функции отправки long, short, double, char * и даже просто блока памяти.
С++ такими вещами не занимается. Такими вещами занимаются CORBA, DCOM
и подобные им аналоги. Вот их и смотри.