数据格式-个人整理

在整理代码时想到是否有比JSON更好的数据格式没有,然后就了解当下有哪些数据格式。

1.自定义二进制  

        要自己实现,有开发维护需求, 专业度高;效率高。

2.提供序列化和反序列化库的开源协议 

        【如protocol buffers,Thrift】;

        引入第三方库,        

3.文本化协议 

        【如json,xml】 

        传输效率低

 

-----------------------------------------------------------

2024年7月25日  15点05分 ,今天先整理到这,如下已经满足大部分开发使用了

----------------------------------------------------------

数据格式
  1. YAML (YAML Ain't Markup Language): YAML 是一种直观的数据序列化格式,旨在使人类编写和阅读数据变得容易。它使用空白和缩进来表示层次结构,这使得 YAML 文件通常比 JSON 文件更易于阅读和编写。
  2. TOML (Tom's Obvious, Minimal Language): TOML 是另一种轻量级的配置文件格式,设计用于易于阅读和编写。它支持基本的数据类型以及数组和表格,并且具有明确的语法,这使得它非常适合配置文件。
  3. XML (eXtensible Markup Language): XML 是一种标记语言,用于结构化文档和数据。虽然它通常比 JSON 或 YAML 更冗长,但它提供了丰富的结构和命名空间支持,使其在某些领域仍然很受欢迎。
  4. CSV (Comma-Separated Values): CSV 是一种简单的平面文件格式,用于存储表格数据。它非常适合存储和传输数据集,但不适合复杂的嵌套数据结构。
  5. Protocol Buffers: Protocol Buffers 是 Google 开发的一种高效的数据交换格式,它使用二进制格式,因此在传输和解析速度上优于文本格式。虽然它不如 JSON 或 YAML 人性化,但在性能敏感的应用中非常有用。
  6. MessagePack: MessagePack 是一种高效的二进制序列化格式,类似于 Protocol Buffers,但不需要显式的模式定义。它支持多种语言,并且在许多情况下比 JSON 更紧凑。
  7. Properties (Java Properties Format): 这是一种简单的键值对格式,主要用于 Java 应用程序的配置文件。它使用等号 (=) 分隔键和值,使用井号 (#) 表示注释。
  8. INI Files: INI 文件格式是一种简单的配置文件格式,使用节和键值对。它被广泛用于 Windows 应用程序的配置文件。

 9. Avro

 Avro,是指数据序列化的系统,有丰富的数据结构类型、快速可压缩的二进制数据形式。

当Avro数据存储到文件中时,它的模式也随之存储,这样任何程序都可以对文件进行处理。

Avro依赖于模式(Schema)。Avro数据的读写操作是很频繁的,而这些操作都需要使用模式,这样就减少写入每个数据资料的开销,使得序列化快速而又轻巧。这种数据及其模式的自我描述方便于动态脚本语言的使用。

Avro模式是用JSON(一种轻量级的数据交换模式)定义的,这样对于已经拥有JSON库的语言可以容易实现。

原文链接: Avro_百度百科

10.Thrift

Thrift包含一套完整的栈来创建客户端和服务端程序。顶层部分是由Thrift定义生成的代码。而服务则由这个文件客户端和处理器代码生成。在生成的代码里会创建不同于内建类型的数据结构,并将其作为结果发送。协议和传输层是运行时库的一部分。有了Thrift,就可以定义一个服务或改变通讯和传输协议,而无需重新编译代码。除了客户端部分之外,Thrift还包括服务器基础设施来集成协议和传输,如阻塞、非阻塞及多线程服务器。栈中作为I/O基础的部分对于不同的语言则有不同的实现。

Thrift支持众多通讯协议:

  • TBinaryProtocol – 一种简单的二进制格式,简单,但没有为空间效率而优化。比文本协议处理起来更快,但更难于调试。

  • TCompactProtocol – 更紧凑的二进制格式,处理起来通常同样高效。

  • TDebugProtocol – 一种人类可读的文本格式,用来协助调试。

  • TDenseProtocol – 与TCompactProtocol类似,将传输数据的元信息剥离。

  • TJSONProtocol – 使用JSON对数据编码。

  • TSimpleJSONProtocol – 一种只写协议,它不能被Thrift解析,因为它使用JSON时丢弃了元数据。适合用脚本语言来解析。

支持的传输协议有:

  • TFileTransport – 该传输协议会写文件。

  • TFramedTransport – 当使用一个非阻塞服务器时,要求使用这个传输协议。它按帧来发送数据,其中每一帧的开头是长度信息。

  • TMemoryTransport – 使用存储器映射输入输出。(Java的实现使用了一个简单的ByteArrayOutputStream。)

  • TSocket – 使用阻塞的套接字I/O来传输。

  • TZlibTransport – 用zlib执行压缩。用于连接另一个传输协议。

Thrift还提供众多的服务器,包括:

  • TNonblockingServer – 一个多线程服务器,它使用非阻塞I/O(Java的实现使用了NIO通道)。TFramedTransport必须跟这个服务器配套使用。

  • TSimpleServer – 一个单线程服务器,它使用标准的阻塞I/O。测试时很有用。

  • TThreadPoolServer – 一个多线程服务器,它使用标准的阻塞I/O

原文链接: thrift_百度百科

自定义二进制-简易参考代码

一种简易网络传输数据格式【替代json/xml】_类似json的数据格式-CSDN博客

提供一种简单的key-val数据封装,无需引入库,仅仅是一个简单的类,传输效率效率远高于第3种方式。名为 DatX。

DatX一定程度上只是提供了一种方案,起抛砖引玉的作用,但同时此处提供的DatX代码也是一个完整的,可直接引入工程使用的类。
如果愿意使用,请保留类注释中的作者笔名[hicker]^_^


注意:由于未使用算法优化内存的分配,故每调用一次Put都会重新malloc/free内存。有必要可以自己实现一个内存分配算法


主要接口:
// 添加数据
BOOL Put(char *szKey, int iVal);
BOOL Put(char *szKey, float fVal);
BOOL Put(char *szKey, void *pData, int nData);
// 反序列化
BOOL UnPack(void *pData, int nData);
// 获取第i个key名
char *GetKey(int i);
// 获取key所对应的val,类型为xty
xty operator[](int i);
xty operator[](char *szKey);
// 将返回DatX数据的二进制流,以及大小
void *Bytes();
int Total();

代码如下,只有一个结构体DatX

DatX.h
 

/*************************************************************************
** Desc		: 为避免使用json和xml做网络传输,实现一种简单key-val数据类型,
**				内存结构如下: [cnt|int_key|xty_key|int_dat|xty|xty_dat]
**				cnt_seg: 数据个数段,iCnt,xCnt
**				int_key_seg: int/float型key
**				xty_key_seg: xty型key
**				int_dat: int型数据区
**				xty: xty区
**				xty_dat: xty.p的数据区
**				【注意】DatX会自动将int型key/val保存在xty型key/val前
** Author	: hicker@2017-3-19 11:11:57
*************************************************************************/
typedef struct tagDatX
{tagDatX() :iCnt(0), xCnt(0), __p(NULL), __n(sizeof(iCnt) + sizeof(xCnt)), __p_cnt(NULL), __p_int_key(NULL), __p_xty_key(NULL), __p_int_dat(NULL), __p_xty(NULL), __p_xty_dat(NULL), __z_xty_dat(0){}tagDatX(void *pData, int nData) :iCnt(0), xCnt(0), __p(NULL), __n(sizeof(iCnt) + sizeof(xCnt)), __p_cnt(NULL), __p_int_key(NULL), __p_xty_key(NULL), __p_int_dat(NULL), __p_xty(NULL), __p_xty_dat(NULL), __z_xty_dat(0){UnPack(pData, nData);}~tagDatX(){ if (__p) free((void*)__p); }typedef struct tagxty{tagxty():p(NULL),l(0){}char *ToChar(int *nLen = 0){ if (nLen)*nLen = l; return (char*)p; };int ToInt(){ return l; };float ToFloat(){ return *((float*)&l); };private:int p; // xty数据内存偏移量int l; // xty数据大小friend tagDatX;}xty;BOOL Put(char *szKey, int iVal){// 保存旧偏移save_old_ofs();// 申请新内存__n += __z_k + __z_i;__p = (int)malloc(__n);if (__p == NULL){__p = __p_old;__n = __n_old;return FALSE;}memset((void*)__p, 0, __n);iCnt++;// 计算新偏移量calc_new_ofs();// __z_xty_dat;// 保存旧数据if (__p_old) save_old_dat();// 保存新数据((int*)__p_cnt)[0] = iCnt;((int*)__p_cnt)[1] = xCnt;strcpy((char*)(__p_int_key + iCnt_old*__z_k), szKey);*(int*)(__p_int_dat + iCnt_old*__z_i) = iVal;return TRUE;}BOOL Put(char *szKey, float fVal){return Put(szKey, *(int*)&fVal);}BOOL Put(char *szKey, void *pData,int nData){// 保存旧偏移save_old_ofs();// 申请新内存__n += __z_k + __z_c+nData;__p = (int)malloc(__n);if (__p == NULL){__p = __p_old;__n = __n_old;return FALSE;}memset((void*)__p, 0, __n);xCnt++;// 计算新偏移量calc_new_ofs();__z_xty_dat +=nData; // 保存旧数据if (__p_old) save_old_dat();// 保存新数据((int*)__p_cnt)[0] = iCnt;((int*)__p_cnt)[1] = xCnt;strcpy((char*)(__p_xty_key + xCnt_old*__z_k), szKey);((int*)(__p_xty + __z_x*xCnt_old))[0] = __z_xty_dat_old;((int*)(__p_xty + __z_x*xCnt_old))[1] = nData;memcpy((void*)(__p_xty_dat + __z_xty_dat_old), pData, nData);return TRUE;}BOOL UnPack(void *pData, int nData){// 保存旧偏移save_old_ofs();// 申请新内存__n = nData;__p = (int)malloc(__n);if (__p == NULL){__p = __p_old;__n = __n_old;return FALSE;}memcpy((void*)__p, pData, __n);// 解析 iCnt,xCntiCnt = ((int*)__p)[0];xCnt = ((int*)__p)[1];// 计算新偏移量calc_new_ofs();// 解析__z_xty_datfor (int i = iCnt; i < iCnt + xCnt; i++)__z_xty_dat += ((int*)(__p_xty + i*__z_x))[1];//((*this)[i]).l;return TRUE;}char *GetKey(int i){if (i < iCnt + xCnt){return (char*)(__p_int_key + (i*__z_k));}return NULL;};xty operator[](int i){xty x;if (i < iCnt){x.l = *(int*)(__p_int_dat + (i*__z_i));}else if (i < iCnt + xCnt){//memcpy(&x, (void*)(__p_xty+((i-iCnt)*__z_x)), __z_x);x.p = ((int*)(__p_xty + ((i - iCnt)*__z_x)))[0];x.l = ((int*)(__p_xty + ((i - iCnt)*__z_x)))[1];x.p += __p_xty_dat;}return x;}xty operator[](char *szKey){xty x;for (int i = 0; i < iCnt+xCnt; i++){if (strcmp(szKey, (char*)(__p_int_key + (i*__z_k))) == 0)return (*this)[i];}return x;}void *Bytes(){ return (void*)__p; }int Total(){ return __n; }private:void save_old_ofs(){// 保存旧偏移__p_old = __p;__n_old = __n;__p_cnt_old = __p_cnt;__p_int_key_old = __p_int_key;__p_xty_key_old = __p_xty_key;__p_int_dat_old = __p_int_dat;__p_xty_old = __p_xty;__p_xty_dat_old = __p_xty_dat;__z_xty_dat_old = __z_xty_dat;iCnt_old = iCnt;xCnt_old = xCnt;}void save_old_dat(){// 保存旧数据memcpy((void*)__p_cnt, (void*)__p_cnt_old, __z_c);memcpy((void*)__p_int_key, (void*)__p_int_key_old, __z_k*iCnt_old);memcpy((void*)__p_xty_key, (void*)__p_xty_key_old, __z_k*xCnt_old);memcpy((void*)__p_int_dat, (void*)__p_int_dat_old, __z_i*iCnt_old);memcpy((void*)__p_xty, (void*)__p_xty_old, __z_x*xCnt_old);memcpy((void*)__p_xty_dat, (void*)__p_xty_dat_old, __z_xty_dat_old);free((void*)__p_old);}void calc_new_ofs(){ // 计算新偏移量__p_cnt = __p;__p_int_key = __p_cnt + __z_c;__p_xty_key = __p_int_key + __z_k*iCnt;__p_int_dat = __p_xty_key + __z_k*xCnt;__p_xty = __p_int_dat + __z_i*iCnt;__p_xty_dat = __p_xty + __z_x*xCnt;}
public:int iCnt; // int/float 个数int xCnt; // xty 个数private:static const int __z_k = 32; // szKey最大长度static const int __z_c = sizeof(int) * 2; // 头大小[sizeof(iCnt) + sizeof(xCnt);]static const int __z_i = sizeof(int); // int大小static const int __z_x = sizeof(int) * 2; // xty大小[sizeof(xty::p)+sizeof(xty::l)]// 各数据段偏移量int __p_cnt;int __p_int_key;int __p_xty_key;int __p_int_dat;int __p_xty;int __p_xty_dat;int __z_xty_dat;// 各数据段old偏移量int __p_old ;int __n_old;int __p_cnt_old;int __p_int_key_old;int __p_xty_key_old;int __p_int_dat_old;int __p_xty_old;int __p_xty_dat_old;int __z_xty_dat_old;int iCnt_old;int xCnt_old;int __p; // 内存起始地址int __n; // 内存中的大小
}DatX;

参考文章:

1. 一种简易网络传输数据格式【替代json/xml】_类似json的数据格式-CSDN博客

2. 替代JSON-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1488637.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Docker安全管理与HTTPS协议

1 Docker容器的安全管理注意事项 Docker本身的架构与机制就可能产生问题&#xff0c;例如这样一种攻击场景&#xff0c;黑客已经控制了宿主机上的一些容器&#xff0c;或者获得了通过在公有云上建立容器的方式&#xff0c;然后对宿主机或其他容器发起攻击。 1. 容器之间的局…

C++ Lambda表达式个人理解

1、Lambda概述 lambda表达式&#xff08;也称为lambda函数&#xff09;是在调用或作为函数参数传递的位置处定义匿名函数对象的便捷方法。通常&#xff0c;lambda用于封装传递给算法或异步方法的几行代码。 2、Lambda表达式定义 2.1 Lambda表达式实例 Lambda有很多叫法&…

按图搜索新体验:阿里巴巴拍立淘API返回值详解

阿里巴巴拍立淘API是一项基于图片搜索的商品搜索服务&#xff0c;它允许用户通过上传商品图片&#xff0c;系统自动识别图片中的商品信息&#xff0c;并返回与之相关的搜索结果。以下是对阿里巴巴拍立淘API返回值的详细解析&#xff1a; 一、主要返回值内容 商品信息 商品列表…

深度学习趋同性的量化探索:以多模态学习与联合嵌入为例

深度学习趋同性的量化探索&#xff1a;以多模态学习与联合嵌入为例 参考文献 据说是2024年最好的人工智能论文&#xff0c;是否有划时代的意义&#xff1f; [2405.07987] The Platonic Representation Hypothesis (arxiv.org) ​arxiv.org/abs/2405.07987 趋同性的量化表达 …

CentOS搭建Apache服务器

安装对应的软件包 [roothds ~]# yum install httpd mod_ssl -y 查看防火墙的状态和selinux [roothds ~]# systemctl status firewalld [roothds ~]# cat /etc/selinux/config 若未关闭&#xff0c;则关闭防火墙和selinux [roothds ~]# systemctl stop firewalld [roothds ~]# …

全新微软语音合成网页版源码,短视频影视解说配音网页版系统-仿真人语音

源码介绍 最新微软语音合成网页版源码&#xff0c;可以用来给影视解说和短视频配音。它是TTS文本转语言&#xff0c;API接口和PHP源码。 这个微软语音合成接口的源码&#xff0c;超级简单&#xff0c;就几个文件搞定。用的是官方的API&#xff0c;试过了&#xff0c;合成速度…

Github个人网站搭建详细教程【Github+Jekyll模板】

文章目录 前言一、介绍1 Github Pages是什么2 静态网站生成工具3 Jekyll简介Jekyll 和 GitHub 的关系 4 Mac系统Jekyll的安装及使用安装Jekyll的简单使用 二、快速搭建第一个Github Pages网站三、静态网站模板——Chirpy1 个人定制 四、WordPress迁移到Github参考资料 前言 23…

DMv8共享存储集群部署

DMv8共享存储集群部署 环境说明 操作系统&#xff1a;centos7.6 服务器&#xff1a;2台虚拟机 达梦数据库版本&#xff1a;达梦V8 安装前准备工作 参考达梦官方文档&#xff1a;https://eco.dameng.com/document/dm/zh-cn/ops/DSC-installation-cluster.html#%E4%B8%80%E3…

Java面试八股之什么是spring boot starter

什么是spring boot starter Spring Boot Starter是Spring Boot项目中的一个重要概念。它是一种依赖管理机制&#xff0c;用于简化Maven或Gradle配置文件中的依赖项声明。Spring Boot Starter提供了一组预定义的依赖关系&#xff0c;这些依赖关系被封装在一个单一的包中&#x…

昇思25天学习打卡营第22天|munger85

LSTMCRF序列标注 我们希望得到这个模型来对词进行标注&#xff0c;B是开始&#xff0c;I是实体词的非开始&#xff0c;O是非实体词。 我们首先需要lstm对序列里token的记忆&#xff0c;和计算每个token发到crf的分数&#xff0c;发完了再退出来&#xff0c;最后形成1模型。那么…

海山数据库(He3DB)技术解析:海山Redis定时任务与持久化管控设计

文章目录 引言一、背景介绍二、具体实现1、多副本容灾功能2、主备切换后任务断点续做功能3、持久化管控编排功能 三、总结作者 引言 云Redis数据库服务是目前广泛应用的模式&#xff0c;其数据持久化方案是现在研究的热点内容&#xff0c;数据持久化操作主要由参数设置自动触发…

500元左右有好用的开放式耳机吗?百元开放式耳机推荐

正所谓授人以鱼不如授人以渔&#xff0c;在此大圣分享一下我选开放式耳机的的一切技巧。 在挑选开放式耳机的时候&#xff0c;我主要会考察以下这些点&#xff1a; 1-音质表现 关注频响范围&#xff0c;确保能涵盖您常听音乐类型所需的频率。 留意声音的清晰度、层次感和失…

halcon_C#联合halcon打开摄像头

1. 创建halcon项目 -> 2.测试连接 -> 3. 在halcon中打开摄像头成功 -> 4. 插入代码 -> 5. 导出为.cs文件 6. 创建VS项目 -> 7.将action部分代码嵌入winform -> 8. 编写代码 -> // 导入HalconDotNet命名空间&#xff0c;这是用于Halcon图像处理的…

IF=8.5 MIMIC-IV高阶玩法!中国用新指标SHR+机器学习拿一区top,思路太牛了

‍ MIMIC-IV 发文难&#xff1f;那是你还没遇到对的思路&#xff01;如今机器学习数据库挖掘的文章层出不穷&#xff0c;今天介绍的这篇文章是在MIMIC-IV数据库的基础上&#xff0c;用了一个新指标—应激性高血糖比&#xff08;SHR&#xff09;&#xff0c;结合机器学习构建预测…

【网络流】——初识(最大流)

网络流-最大流 基础信息引入一些概念基本性质 最大流定义 Ford–Fulkerson 增广Edmons−Karp算法Dinic 算法参考文献 基础信息 引入 假定现在有一个无限放水的自来水厂和一个无限收水的小区&#xff0c;他们之间有多条水管和一些节点构成。 每一条水管有三个属性&#xff1a…

土耳其云手机提升TikTok电商效率

在数字化飞速发展的今天&#xff0c;TikTok不仅是一个社交平台&#xff0c;更是一个巨大的电商市场。随着TikTok电商功能在全球范围内的扩展&#xff0c;土耳其的商家和内容创作者正面临着前所未有的机遇。本文将详细介绍土耳其云手机怎样帮助商家抓住机遇&#xff0c;实现业务…

内置命令和外置命令(用户组配置文件)

通过cat /etc/group来查看用户组的权限&#xff0c;/etc/group文件包含了系统上所有用户组的信息。每一行代表一个用户组。 用户组配置文件格式如下&#xff1a; group_name:password:GID:user_list group_name&#xff1a;用户组的名称。password&#xff1a;用户组的密码。…

达门如何用虚拟现实辅助工程技术造船?

在当代造船以及海事行业中&#xff0c;虚拟现实辅助工程&#xff08;VR Aided Engineering&#xff09;技术的使用&#xff0c;正在快速演进并提供新的工业应用案例。该技术改变了从设计阶段到建造&#xff0c;再到船舶运营各个阶段的工作流程&#xff0c;进而提高效率、优化性…

旗晟机器人仪器仪表识别AI智慧算法

在当今迅猛发展的工业4.0时代&#xff0c;智能制造和自动化运维已然成为工业发展至关重要的核心驱动力。其中智能巡检运维系统扮演着举足轻重的角色。工业场景上不仅要对人员行为监督进行监督&#xff0c;对仪器仪表识别分析更是不可缺少的一个环节。那么我们说说旗晟仪器仪表识…

商场导航系统:从电子地图到AR导航,提升顾客体验与运营效率的智能解决方案

商场是集娱乐、休闲、社交于一体的综合性消费空间&#xff0c;随着商场规模的不断扩大和布局的日益复杂&#xff0c;顾客在享受丰富选择的同时&#xff0c;也面临着寻路难、店铺曝光率低以及商场管理效率低下等挑战。商场导航系统作为提升购物体验的关键因素&#xff0c;其重要…