Варианты сериализации без библиотек
От: Shmj Ниоткуда  
Дата: 14.09.24 06:29
Оценка:
Вопрос такой.

Если нужна очень легкая сериализация без библиотек. В самом простом случае можно вручную каждое поле привести к бинарному виду и восстановить. Но это много ручной работы. Рефлексию не подвезли.

Можно весь объект привести к бинарному виду, но тут много проблем — даже если добавить логику работы с указателями, то есть проблема разного бинарного представления типов в памяти (выравнивание).

Какие еще варианты?
Re: Варианты сериализации без библиотек
От: Нomunculus Россия  
Дата: 14.09.24 06:33
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Какие еще варианты?


printf
scanf
Re[2]: Варианты сериализации без библиотек
От: Shmj Ниоткуда  
Дата: 14.09.24 11:20
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>printf

Н>scanf

Больше интересует есть ли хотя бы какой-то способ, чтобы не писать вручную имя каждого поля.
Re[3]: Варианты сериализации без библиотек
От: Великий Реверс google
Дата: 14.09.24 11:42
Оценка: 16 (2) +1 -2 :))
есть, нанять программист который это сделает за тебя

зы
анекдот
когда бог захотел создать идеальный язык программирования он создал Страуструпа а тот создал С++
когда бог понял что программировать на С++ стало слишком просто, он создал Шмыгу и тот начал генерить бредовопросы на форуме
Re[3]: Варианты сериализации без библиотек
От: kov_serg Россия  
Дата: 14.09.24 11:45
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Больше интересует есть ли хотя бы какой-то способ, чтобы не писать вручную имя каждого поля.

Используйте генераторы кода, что бы не писать вручную

https://kaitai.io
Re[4]: Варианты сериализации без библиотек
От: Shmj Ниоткуда  
Дата: 14.09.24 14:46
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>https://kaitai.io


Пишут что якобы можно и без шага кодогенерации как в boost/pfr:

#include <boost/pfr.hpp>
#include <iostream>

struct MyObject {
    int id;
    float value;
};

int main() {
    MyObject obj = {42, 3.14f};

    boost::pfr::for_each_field(obj, [](const auto &field, std::size_t index) {
        std::cout << "Field " << index << ": " << field << std::endl;
    });

    MyObject obj2 = {42, 3.14f};
    if (boost::pfr::eq(obj, obj2)) {
        std::cout << "Objects are equal!" << std::endl;
    }

    return 0;
}


Но как это возможно?
Re[5]: Варианты сериализации без библиотек
От: Нomunculus Россия  
Дата: 14.09.24 14:51
Оценка: -1
Здравствуйте, Shmj, Вы писали:

Не надо так делать. Save/Load должны быть в самой структуре и принимать на вход абстрактный сериализатор. А вот уже его реализуешь как хочешь
Re[6]: Варианты сериализации без библиотек
От: Shmj Ниоткуда  
Дата: 14.09.24 15:01
Оценка: :)
Здравствуйте, Нomunculus, Вы писали:

Н>Не надо так делать. Save/Load должны быть в самой структуре и принимать на вход абстрактный сериализатор. А вот уже его реализуешь как хочешь


Просто у меня около 40 наследников и все из нужно сериализовать/десериализовать бинарно. Даже если в каждый добавить 2 метода, по 5 минут на метод — уйдет — 10*40=400 минут, т.е. считай целый день.

Вроде можно добавить alignas(1) каждому и тогда вроде бинарный код будет без отступов, одинаковым на всех системах. Порядок байт на всех компьютерах мира остался только LittleEndian — BigEndian на планете уже считай нету.
Re[7]: Варианты сериализации без библиотек
От: Нomunculus Россия  
Дата: 14.09.24 15:05
Оценка:
Здравствуйте, Shmj, Вы писали:

40 наследников??
А ты уверен, что это надо реализовывать именно через архитектуру наследования?
Re[8]: Варианты сериализации без библиотек
От: Shmj Ниоткуда  
Дата: 14.09.24 15:15
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>40 наследников??

Н>А ты уверен, что это надо реализовывать именно через архитектуру наследования?

А как же еще
Автор: Shmj
Дата: 31.08 15:40
?
Re[9]: Варианты сериализации без библиотек
От: Нomunculus Россия  
Дата: 14.09.24 15:17
Оценка:
Здравствуйте, Shmj, Вы писали:

Не понял задачу. Ты пишешь код, генерящий код?
Я к тому что не обязательно ООП везде тянуть. Не, зачастую конечно надо, но иногда можно и enum-ом обойтись. Ну это конечно задачу смотреть надо.
Re[10]: Варианты сериализации без библиотек
От: Shmj Ниоткуда  
Дата: 14.09.24 15:22
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>Не понял задачу. Ты пишешь код, генерящий код?

Н>Я к тому что не обязательно ООП везде тянуть. Не, зачастую конечно надо, но иногда можно и enum-ом обойтись. Ну это конечно задачу смотреть надо.

Ну да, дерево AST для JS в виде JSON. По нему создается дерево объектов C++ — для каждой инструкции свой класс. Без объектов будет весьма не удобно.
Re[11]: Варианты сериализации без библиотек
От: Нomunculus Россия  
Дата: 14.09.24 15:45
Оценка:
Здравствуйте, Shmj, Вы писали:

Тут наверное лучше опять-таки не наследование, а шаблонный класс.
Ну, конечно, надо детальнее знать. Может, и нет
Re[12]: Варианты сериализации без библиотек
От: Shmj Ниоткуда  
Дата: 14.09.24 16:19
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>Тут наверное лучше опять-таки не наследование, а шаблонный класс.

Н>Ну, конечно, надо детальнее знать. Может, и нет

Так а какие вам детали? Каждая инструкция JS имеет разное количество и порядок вложенных инструкций. К примеру if/else — имеет инструкцию для вычисления условия (то что внутри скобочек if), тело if и опционально тело else. Зачем тут шаблоны?
Re[6]: Варианты сериализации без библиотек
От: σ  
Дата: 14.09.24 17:32
Оценка:
Н> Save/Load должны быть в самой структуре
Жабакодер?
Re[7]: Варианты сериализации без библиотек
От: Нomunculus Россия  
Дата: 14.09.24 17:34
Оценка:
Здравствуйте, σ, Вы писали:

Н>> Save/Load должны быть в самой структуре

σ>Жабакодер?

Кто? Я? В жизни ни строчки на джаве не написал
Re[7]: Варианты сериализации без библиотек
От: B0FEE664  
Дата: 17.09.24 12:02
Оценка: +1
Здравствуйте, Shmj, Вы писали:

Н>>Не надо так делать. Save/Load должны быть в самой структуре и принимать на вход абстрактный сериализатор. А вот уже его реализуешь как хочешь

S>Просто у меня около 40 наследников и все из нужно сериализовать/десериализовать бинарно. Даже если в каждый добавить 2 метода, по 5 минут на метод — уйдет — 10*40=400 минут, т.е. считай целый день.
Всего-то день.

S>Вроде можно добавить alignas(1) каждому и тогда вроде бинарный код будет без отступов, одинаковым на всех системах. Порядок байт на всех компьютерах мира остался только LittleEndian — BigEndian на планете уже считай нету.

Не о том думаете. Подумайте лучше, что будет когда вы поменяете в одной из структур два поля местами или тип одного из поля.
И каждый день — без права на ошибку...
Re[8]: Варианты сериализации без библиотек
От: Shmj Ниоткуда  
Дата: 17.09.24 12:45
Оценка:
Здравствуйте, B0FEE664, Вы писали:

S>>Вроде можно добавить alignas(1) каждому и тогда вроде бинарный код будет без отступов, одинаковым на всех системах. Порядок байт на всех компьютерах мира остался только LittleEndian — BigEndian на планете уже считай нету.

BFE>Не о том думаете. Подумайте лучше, что будет когда вы поменяете в одной из структур два поля местами или тип одного из поля.

Это чисто для внутреннего использования, если поменяется структура — сразу же поменяются и инициализирующие данные — не проблема.

Тут беда в том что есть векторы у которых указан тип базовый класс, а вмещают они наследников через умный указатель. Боюсь что это бинарной сериализацией никак не разрулить.
Re[7]: Варианты сериализации без библиотек
От: K13 http://akvis.com
Дата: 22.09.24 18:00
Оценка:
Здравствуйте, σ, Вы писали:

Н>> Save/Load должны быть в самой структуре

σ>Жабакодер?

Скорее, наследие MFC.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.