Комментарии 4
за js-сериализацию в байты нужно расстреливать на месте!
90% "подводных" от самого поведения js как языка, из-за чего итоговая сериализуемая структура получается очень "плавающей"
самое "забавное" в том, что те кто знаком с другими языками и знает за сериализации в байты и обратно - такие на js пишут строгие трансформеры, что не тупо загоняют данные в файл, а согласно строгой разметке (и с таким нет проблем ни в одном языке потом)
но фронт-ендеры всегда были "выше" общепринятых стандартов, потому за пределами json склейка строк еще нормально смотрится, ведь как только начинают лезть в байты, начинается каша вплоть до того что байтовые значения разделяются символом (!!!) что бы можно было определить где заанчивается одно и начинается другое. И из этого вылазят иерархические костыли, когда одн вылезшй баг фиксят ценой другого нового бага
Про культуру соглашусь, да. Но конкретно Yjs и Loro как раз length-prefix и varint, а не разделители: lib0 пишет длину и следом байты, у Loro посткард плюс колоночный слой. Это ближе к тому строгому трансформеру, про который вы пишете, чем к склейке через символ. Грабли, что я ловил, тоньше: схлопывание тумбстоунов при GC да big-endian остров в одном поле. Не каша, но без сверки байтов и не угадаешь конечно
и самое печальное что protobuf "просто существует" как и многжество других языков разметки, что могут сгегенрировать енкодеры/декодеры в js другие языки
сам не фронт-ендер, но если нужно что-то на клиенте собирать и отдавать то юзаю протобаф плюс сжатие что бы как раз добится гарантированной переносимости. И довольно компактно получается
я например до сих пор кекаю с того как сформировано хранение в https://azgaar.github.io/Fantasy-Map-Generator/ и сколько проблем героически было побеждено ими на этом поприще)) И там на гитхабе как раз видно как они приходят постепенно к "бинарному формату", но там именно тот самый "бинарный формат курильщика" про который я говорил
На практике сталкивался с тем, что порядок байт и выравнивание на ARM и x86 дают разные результаты даже при идентичных бинарных структурах. Для CI хорошо заходит комбинация из property-based тестов + сидирование рандома для воспроизводимости.

Все тесты зелёные, а байты разные: как я проверяю порты бинарных форматов