LINUX.ORG.RU

Сериализация структур. Нет вопроса. Ваши замечания

 


0

1

Здравствуйте. Собственно, вопросов никаких не имею. Но, возможно, кто-нибудь захочет взглянуть незамутненным взглядом и найдет подводные камни. Или предложит улучшения.

Надоело мне гонять JSON между сервером и клиентом и было решено накостылять свой формат сериализации коллекции структур. Максимально простой в парсинге и восприятии человеком, но со схемой и валидацией.

Сначала идет схема, а следом данные. Данные отделяются между собой ENTER-ами.

Символ "-" означает дефолтное значение поля или пустое значние в схеме. И вот с ним возникает определенная загвоздка. Непонятно что делать, если понадобится интерпретировать его буквально как "-", а не как пустое поле

Формат схемы:

Имя_поля Тип Дефолтное_значение Минимум Максимум

Схема для типа enum

Имя_поля enum Дефолтное_Значение Имя_1 Имя_2 ...

Пример (коллекция из двух человек)

id number - 0 -
name string "John Doe" 1 100
sex enum Male Male Female
hetero boolean true
notes string - 0 500

1
Пертов
-
-
Поддержка\n\t escape-последовательностей

2
Иванова
Female
false
-
★★★★★

«Вы изобрели YAML, только хуже.»

Почему, собственно, не его?

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx

Насколько я понимаю, чтобы в ямле описать коллекцию структур, понадобится повторять имя поля для каждого поля в каждой структуре. И еще не могу найти, есть ли в нем встроеная валидация. Она, хоть и примитивная, но нужна. Лень постоянно проверять типы и лимиты в коде

makoven ★★★★★ ()
Ответ на: комментарий от makoven

понадобится повторять имя поля для каждого поля в каждой структуре

IMHO так даже читабельнее...

есть ли в нем встроеная валидация

Разве что типов данных. Но на вики пишут, что можно прикрутить какие-то валидаторы.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)

Непонятно что делать, если понадобится интерпретировать его буквально как "-", а не как пустое поле

Используй backslash же: «\-»

Virtuos86 ★★★★★ ()
Ответ на: комментарий от Virtuos86

Тоже об этом сначала подумал. Наверное так и сделаю. Типа если нужно поле с одним-единственным символом "-" - пиши «\-»

Правда возникает вопрос, а что если нужно поле со значением «\-»

makoven ★★★★★ ()
Последнее исправление: makoven (всего исправлений: 2)
Ответ на: комментарий от yoghurt

Погуглил. А очень даже неплохо. Может и не буду свой велосипед писать) Есть под сишечку. Минифицированный js весит 50kb. Адекватный язык описания схемы. Констрейтов правда нет - это беда.

makoven ★★★★★ ()

Минимум Максимум

Даже для строк и других структур?

anonymous ()
Ответ на: комментарий от anonymous

Для строк длина. А других структур нет. Разве что массивы типизированные еще.

Но что-то я приуныл, глядя на юникод. 20 пробелов и 8 символов newline

makoven ★★★★★ ()
Последнее исправление: makoven (всего исправлений: 2)
Ответ на: комментарий от ziemin

Так и быть, напишу «символами переноса строки» когда мой уберформат будет принимать женевская штаб-кравтира ISO

makoven ★★★★★ ()
Ответ на: комментарий от makoven

Правда возникает вопрос, а что если нужно поле со значением «\-»

Ниже подсказали. Если обратный слэш выполняет роль экрана, то почему бы ему и себя не экранировать. Ты как будто регэкспов ни разу не видел.

Virtuos86 ★★★★★ ()
Ответ на: комментарий от makoven

Кросплатформенности значит не будет? В винде два символа, например.

И при чём тут ISO, если должна машина читать? Это стохастический формат? Должен ли алгоритм чтения проходить тест Тьюринга?

ziemin ★★ ()
Ответ на: комментарий от ziemin

Кросплатформенности значит не будет? В винде два символа, например.

Это ты мне скажи. надо ли кроме CR и LF интерпретировать NEL LS и PS?

И при чём тут ISO, если должна машина читать?

Задумка в том, чтобы можно было и руками написать если что и глазами проанализировать HTTP-запрос если что. И без проблем распарсить любым примитивным языком, если что )

makoven ★★★★★ ()

Можно услышать о причинах изобретения своего решения и плюсах по сравнению с рассмотренными вами существующими решениями?

qnikst ★★★★★ ()
Ответ на: комментарий от qnikst

о причинах изобретения своего решения

JSON избыточен для коллекций и не умеет в типы и ограничения. YAML тяжел для браузера и есть не на всех языках. Protobuf - есть не везде и бинарный.

и плюсах

Типизация. Сам себя валидирует. Ограничения для значений. Парсер (надеюсь) в пару сотен строк - легко реализовать на нужном языке. Человекочитаемый/писаемый. Для простых скриптов можно пропустить схему и тупо читать значения линия за линией.

makoven ★★★★★ ()
Ответ на: комментарий от makoven

надо ли кроме CR и LF интерпретировать NEL LS и PS?

Нет. Только эти.

Задумка в том, чтобы можно было и руками написать если что и глазами проанализировать HTTP-запрос

Лажанулся я с тестом Тьюринга, признаю. Похоже задача сложнее, чем я думал. Как будешь эмулировать руки и глаза - нейросети? Уже копал в сторону GPU? Потому что явно основной процессор не осилит. Или сразу затачиваешь парсер под суперсистемы?

ziemin ★★ ()

Зависимость от порядка полей при передаче данных (не схем) может привести к двойной работе, если вы этот порядок захотите поменять.

bogus_result ()
Ответ на: комментарий от bogus_result

При всей велосипедности задумки ТС хочу отметить, что такие парсеры обычно генерят. По крайней мере я генерю. Так что ИМХО это не проблема.

ziemin ★★ ()
Ответ на: комментарий от bogus_result

Можно в функцию сериализации добавить параметр-массив с порядком полей. Если я вас правильно понял

makoven ★★★★★ ()
Ответ на: комментарий от ziemin

По крайней мере я генерю.

Чем, если не секрет?

Про GPU с нейросетями поржал. Нет, все намного проще - кроудсорсинг. Сделать онлайн сервис, где любой индус сможет парсить ваши данные используя свои руки и глаза

makoven ★★★★★ ()
Последнее исправление: makoven (всего исправлений: 2)
Ответ на: комментарий от makoven

Чем, если не секрет?

В простых случаях (90%) sh.

В сложных иерархических случаях проще лисп (он по-умолчанию иерархический).

Сейчас размяк, захотелось комфорта. Написал интерпретатор карт памяти (конкретно freemind, у него карты в xml). Очень удобно и наглядно.

ziemin ★★ ()
Ответ на: комментарий от makoven

Если взять yaml и потребовать чтобы первым объектом шёл массив типов полей, а дальше шли массивы данных. То получится ровно тоже самое что у тебя, но со спецификацией.

qnikst ★★★★★ ()

Непонятно что делать, если понадобится интерпретировать его буквально как "-", а не как пустое поле

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

mashina ★★★★★ ()
Ответ на: комментарий от yoghurt

А что не протобуф?

Схемы в протобуфе статические. Придётся либо на лету генерировать парсеры и генераторы по схеме и всё равно делать базовый формат для передачи схемы с блобом протобуфа, либо костылить ещё один формат поверх самого протобуфа.

Сильно проще не стало, но из-за убогости протубфного кода не будет некоторых фишек которые можно было бы реализовать в своём парсере. Например, не будет возможности генерировать и парсить поток по частям.

mashina ★★★★★ ()
Ответ на: комментарий от qnikst

Тогда уж лучше эту бадягу поверх JSON реализовать. Разницы особой не будет. Так и сделаю если будет лень писать свой костыль для трех языков

makoven ★★★★★ ()
Ответ на: комментарий от mashina

Схемы в протобуфе статические. Придётся либо на лету генерировать парсеры и генераторы по схеме и всё равно делать базовый формат для передачи схемы с блобом протобуфа, либо костылить ещё один формат поверх самого протобуфа.

Не распарсил. Любая либа умеет читать файлы со схемой. Получаешь бинарь (например, в теле HTTP-ответа), натравливаешь его на схему - на выходе распарсенный объект. В обратную сторону тоже самое. Или я не прав?

makoven ★★★★★ ()
Ответ на: комментарий от anonymous

Они не умеют в схему. Вот представь, получил ты json. И хрен пойми что в нем. Как в таких условиях работать? Проверять кодом всю структуру?

makoven ★★★★★ ()
Ответ на: комментарий от makoven

Любая либа умеет читать файлы со схемой... Или я не прав?

Реализации протобуфа обычно так не работают, они из схемы гененируют код парсеров и генераторов пакетов на выбранном ЯП. Далее, в зависимости, от ЯП, код нужно скомпилировать и только потом этим кодом можно что-то делать.

mashina ★★★★★ ()

Короче, забраковали вы мой революционный формат. Значит будет так:

[
["schema", 1.0],

["id", "number", 0],
["name", "string", 1, 100, "Jonh Doe"],
["sex", "enum", "Male", "Female", "Male"],
["hetero", "boolean", true],

["data"],

[1, "Петров"],
[2, " Иванова", "Female", false]
]

makoven ★★★★★ ()
Ответ на: комментарий от makoven
["name", ["string", 1, 100], "Jonh Doe"],
["sex", ["enum", "Male", "Female"], "Male"],
anonymous ()
Ответ на: комментарий от makoven
["schema", 1.0,
  ["id", "number", 0],
  ["name", "string", 1, 100, "Jonh Doe"],
  ["sex", "enum", "Male", "Female", "Male"],
  ["hetero", "boolean", true],
],
anonymous ()
Ответ на: комментарий от anonymous

Это опасный путь. Можно закончить чем-то вроде:

{
  "schema": [
    {
      "name": "id",
      "type": "number",
      "minimum": 0,
      "default": 1
    },
    ...

makoven ★★★★★ ()
Последнее исправление: makoven (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.