Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
новые функции, более высокая производительность, более компактные форматы
В чем прелесть XML? Он реализован под все платформы, «человекочитаемый», для него созданы схемы данных (условно человекочитаемые)
Человекочитаемость запланирована через Редактор, с GUI, без предварительного обучения, а не через «парсер»
бинарный формат, способный полностью заменить XML и JSON
Если формат станет популярным, то его обязательно встроят в браузеры, я буду работать в этом направлении.
Человекочитаемость запланирована через Редактор,
И да, вы выдающая личность, если загружаете JSON из сетевог кабеля непосредственно в мозг :)
Мало чем отличается от анализа битых JSON и XML.
Подсветку синтаксиса JSON там тоже не сразу реализовали.
Снифферы трафика умеют отображать огромное количество бинарных форматов
Вы открываете JSON и XML в редкторе, который скачали и установили себе на компьютер (стандартный блокнот разумеется не подходит).
Значит для вас не будет проблемой скачать и установить редактор для USDS.
Если вы скачаете для работы пакет библиотек USDS, то там же получите и редактор, я об этом позабочусь
Если формат станет популярным, то его обязательно встроят в браузеры
И как у любого бинарного формата — его парсинг будет дешевле, чем JSON
Зато ваш сервер сможет обслуживать в несколько раз больше пользователей

tagged-протоколы мало кому интересны, они медленные, большие, годятся только для отладки.
Я хочу сохранить бинарный докумнет на диск в один файл, в нем будут и данные и схема,
Когда читаете — в обратном порядке.Т.е. вторая сторона должна заранее знать, что я в определенные байтики поместил схему, или парсер Bond сам разберется, что схема в потоке есть и найдет где именно она лежит?
В USDS второй стороне будет проще, т.к. парсер сам найдет схему данных в бинарном докуенте (при условии что ее туда вообще положили).
Добавление самопальных бинарных контейнеров в проект заканчивается провалом, когда к вам приходят партнеры и просят подключить их к этому каналу данны
int PackageSizePos = Package.WriteInt(PACKAGE_SIZE);//пишем сначала 0, а в конце построения перезаписываем размером всего пакета
Package.WriteInt(PROTOCOL_VERSION); //ну чтобы не ломалось ничего при смене версии
Package.WriteInt(WEATHER_INFO); //WEATHER_INFO - константа, которая определяет тип содержимого
Package.WriteInt(WEATHER_PROTOCOL_VERSION);
Package.WriteString("SVO"); //Погода для аэропорта Шереметьево
Package.WriteInt(Data.size()); //Количество периодов за которые есть информация
for (unsigned int block = 0; block<Data.size(); block++){
Package.WriteDouble(Data[block].Date);//Дата и время на которое указана инфа
Package.WriteFloat(Data[block].Temperature);
Package.WriteFloat(Data[block].Humidity);
Package.WriteFloat(Data[block].WindDirection);
Package.WriteFloat(Data[block].WindSpeed);
}
Package.WriteInt(PackageSizePos,Package.size()+sizeof(int));//Пишем размер пакета + добавляем размер контрольки, которой еще нет
Package.WrinteInt(CalcCRC(Package,Package.size()));//Пишем контрольную сумму в конце
if (Package.ReadInt()!=Package.size())
return ERROR_INCORRECT_PACKAGE;
if (Package.ReadInt(Package.size()-sizeof(int))!=CalcCRC(Package,Package.size()-sizeof(int)))
return ERROR_INCORRECT_PACKAGE;
if (Package.ReadInt()!=PROTOCOL_VERSION)
return ERROR_UNSUPPORTED_VERSION;
switch(Package.ReadInt()){
case WEATHER_INFO: return processWeatherPackage(Package);
};
return ERROR_UNSUPPORTED_PACKAGE_DATA;
unsigned int processWeatherPackage(Package)
{
if (Package.ReadInt()!=WEATHER_PROTOCOL_VERSION)
return ERROR_UNSUPPORTED_DATA_VERSION;
std::string Code = Package.ReadString();
if (!checkCode(Code))
return ERROR_INCORRECT_PACKAGE;
unsigned int BlocksCount = Package.ReadInt();
if (BlocksCount>MAX_BLOCKS_COUNT)
return ERROR_INCORRECT_PACKAGE;
Ports[Code].resize(BlocksCount);
for (unsigned int block = 0; block<BlocksCount; block++){
Ports[Code].Data[block].Date = Package.ReadDouble();
Ports[Code].Data[block].Temperature = Package.ReadFloat();
Ports[Code].Data[block].Humidity = Package.ReadFloat();
Ports[Code].Data[block].WindDirection = Package.ReadFloat();
Ports[Code].Data[block].WindSpeed = Package.ReadFloat();
}
return OK;
}
void cPackage::WriteString(const std::string& str )
{
WriteInt(str.size());
if (str.size()>0)
WriteRaw(str.c_str(),str.size());
}
std::string cPackage::ReadString()
{
int Size = ReadInt();
std::string Result = "";
if (Size()>0){
Result.reserve(Size);
for (int i = 0; i<Size; i++)
Result+=ReadChar();
}
return Result;
}
которая не входит в срок 1 вечер.
У вас все еще нет обработки ошибок, юнит-тестов, работы с BigEndian.
Полноценная бинарная замена XML