【JavaScript脚本宇宙】轻量级、高效能:快速了解六种数据序列化神器

玩转数据交换:全面解析六种强大的JavaScript库

前言

本文将介绍六种用于数据序列化和通信的JavaScript库,包括protobuf.js、msgpack-lite、avsc、BSON、Thrift和CBOR。这些库提供了高效、轻量级的数据交换解决方案,可用于各种应用场景,如数据持久化、网络通信、大数据处理等。

欢迎订阅专栏:JavaScript脚本宇宙

文章目录

  • 玩转数据交换:全面解析六种强大的JavaScript库
    • 前言
    • 1. Protobuf.js:一个Protocol Buffers的实现
      • 1.1. 简介
        • 1.1.1. 什么是protobuf.js
        • 1.1.2. 主要功能
      • 1.2. 安装与使用
        • 1.2.1. 安装方法
        • 1.2.2. 基本用法示例
    • 2. msgpack-lite:一个消息打包 (MessagePack) 的轻量级实现
      • 2.1. 简介
        • 2.1.1. 什么是msgpack-lite
        • 2.1.2. 主要功能
      • 2.2. 安装与使用
        • 2.2.1. 安装方法
        • 2.2.2. 基本用法示例
    • 3. avsc:用于Avro数据序列化和反序列化的库
      • 3.1. 简介
        • 3.1.1. 什么是avsc
        • 3.1.2. 主要功能
      • 3.2. 安装与使用
        • 3.2.1. 安装方法
        • 3.2.2. 基本用法示例
      • 3.3. 特性与优势
        • 3.3.1. 高可扩展性
        • 3.3.2. 强类型支持
    • 4. BSON:一种二进制JSON的JavaScript实现
      • 4.1. 简介
        • 4.1.1. 什么是BSON
        • 4.1.2. 主要功能
      • 4.2. 安装与使用
        • 4.2.1. 安装方法
        • 4.2.2. 基本用法示例
      • 4.3. 特性与优势
        • 4.3.1. 嵌套文档支持
        • 4.3.2. 数据类型丰富
    • 5. Thrift:跨语言服务的RPC框架
      • 5.1. 简介
        • 5.1.1. 什么是Thrift
        • 5.1.2. 主要功能
      • 5.2. 安装与使用
        • 5.2.1. 安装方法
        • 5.2.2. 基本用法示例
    • 6. CBOR:一种适合于Internet of Things(IoT)的二进制编码格式
      • 6.1. 简介
        • 6.1.1. 什么是CBOR
        • 6.1.2. 主要功能
      • 6.2. 安装与使用
        • 6.2.1. 安装方法
        • 6.2.2. 基本用法示例
    • 总结

1. Protobuf.js:一个Protocol Buffers的实现

Google开发的Protocol Buffers(简称Protobuf)是一种轻便高效的结构化数据存储格式,可以用于数据序列化。Protobuf.js是其JavaScript实现版本,支持在Node.js和浏览器环境中使用。以下将详细介绍Protobuf.js的各个方面。

1.1. 简介

1.1.1. 什么是protobuf.js

protobuf.js是基于JavaScript的Protocol Buffers库,用于序列化和反序列化结构化数据。它允许开发人员定义数据结构并在运行时生成相应的类来读取和写入这些结构。protobuf.js提供了对原始Protocol Buffers规范的完整支持并完全兼容C++、Java等其他语言实现版本。

1.1.2. 主要功能
  • 序列化: 将JavaScript对象转换为字节流。
  • 反序列化: 将字节流转换为JavaScript对象。
  • Schema定义: 使用.proto文件定义数据结构。
  • 动态加载: 在运行时动态加载schema定义文件。
  • 二进制编码: 支持高效的二进制编码和解码。
  • 跨平台兼容性: 可以在Node.js和浏览器中运行。

1.2. 安装与使用

1.2.1. 安装方法

在Node.js中可以使用npm来安装protobuf.js:

npm install --save protobufjs

在浏览器中可以通过下载构建好的protobuf.min.js文件并在HTML页面中引入:

<script src="protobuf.min.js"></script>

或者通过CDN链接引入:

<script src="https://cdn.jsdelivr.net/npm/protobufjs@6.11.0/dist/protobuf.min.js"></script>
1.2.2. 基本用法示例

首先定义一个.proto文件:

syntax = "proto3"; // use proto3 syntax
message Person {
    string name = 1;
    int32 age = 2;
}

然后在JavaScript中进行序列化和反序列化操作:

const { Message } = require('protobufjs');
// ... load your schema and resolve it to a root, see the documentation for details
const schema = '...'; // assume you have loaded and resolved your schema to a string called "schema"
const person = new Message(schema, 'Person').create({ name: 'John Doe', age: 30 }); // create a message of type Person
const buffer = person.encode().finish(); // serialize the message to a buffer
console.log(buffer); // output: <Buffer 0a 09 4a 6f 68 6e 20 44 6f 65 10 1e>
const decodedPerson = Message(schema, 'Person').decode(buffer); //deserialize the buffer into a Person object
console.log(decodedPerson); // output: { name: 'John Doe', age: 30 }

更多的示例代码可以参考官方文档:Quick Start。

2. msgpack-lite:一个消息打包 (MessagePack) 的轻量级实现

2.1. 简介

2.1.1. 什么是msgpack-lite

msgpack-lite是一个基于JavaScript的消息打包(MessagePack)的轻量级实现库。MessagePack是一种高效的二进制序列化格式,用于在多种编程语言之间进行数据交换。msgpack-lite提供了将JavaScript对象序列化为MessagePack二进制数据流和反序列化MessagePack二进制数据流为JavaScript对象的功能。

2.1.2. 主要功能
  • 将JavaScript对象序列化为MessagePack二进制数据流;
  • 将MessagePack二进制数据流反序列化为JavaScript对象;
  • 支持多种数据类型,包括但不限于数字、字符串、数组、对象等;
  • 兼容Node.js和浏览器运行时环境。

2.2. 安装与使用

2.2.1. 安装方法
npm install msgpack-lite --save

或者可以使用CDN链接:

<script src="https://cdn.jsdelivr.net/npm/msgpack-lite@0.1.x"></script>
2.2.2. 基本用法示例

以下是一个简单的示例代码,展示了如何使用msgpack-lite将JavaScript对象序列化为MessagePack二进制数据流,然后将其反序列化回来:

// 引入msgpack-lite库
var msgpack = require('msgpack-lite');

// 需要被序列化的JavaScript对象
var obj = {
    string: 'Hello, World!',
    number: 42,
    boolean: true,
    null: null,
    undefined: undefined,
    map: { key: 'value' },
    array: [1, 2, 3],
};

// 将JavaScript对象序列化为MessagePack二进制数据流
var binary = msgpack.encode(obj);
console.log(binary); // <Buffer 8a ...>

// 将MessagePack二进制数据流反序列化为JavaScript对象
var decodedObj = msgpack.decode(binary);
console.log(decodedObj); // { string: 'Hello, World!', number: 42, boolean: true, null: null, map: { key: 'value' }, array: [ 1, 2, 3 ] }

3. avsc:用于Avro数据序列化和反序列化的库


3.1. 简介

3.1.1. 什么是avsc

avsc是一个用于对基于Apache Avro的数据进行序列化和反序列化的JavaScript库。它支持解析和生成Avro数据,并提供了对复杂类型(如数组、记录、union和enum)的全面支持。

3.1.2. 主要功能
  • 解析和生成符合Avro标准的二进制和JSON数据;
  • 支持读取和写入所有基本类型(int、long、float、double、boolean、string、bytes);
  • 支持复杂类型,包括数组、记录、联合和枚举;
  • 使用方便,可以通过JavaScript代码快速获取或设置数据。

3.2. 安装与使用

3.2.1. 安装方法

使用npm命令行工具安装avsc:

npm install avsc --save
3.2.2. 基本用法示例

以下是一个简单的示例,演示如何使用avsc对数据进行序列化和反序列化:

const avro = require('avsc');

// 定义数据模式(schema)
const userSchema = {
  type: 'record',
  name: 'User',
  fields: [
    { name: 'id', type: 'int' },
    { name: 'name', type: 'string' }
  ]
};

// 编译模式为JavaScript类型
const UserType = avro.compile(userSchema);

// 创建一个新对象并对其进行序列化
const user = new UserType({ id: 123, name: 'John Doe' });
const buffer = UserType.serialize(user); // 返回Buffer对象

// 从Buffer中反序列化对象
const deserializedUser = UserType.deserialize(buffer);
console.log(deserializedUser); // { id: 123, name: 'John Doe' }

完整的官方文档可以在这里找到。

3.3. 特性与优势

3.3.1. 高可扩展性

avsc允许您通过添加自定义编码器和解码器来扩展其功能。这使您可以为特定的用例实现高效的数据序列化。例如,您可以实现一个自定义编码器来处理日期或时间戳字段的高效序列化。

3.3.2. 强类型支持

由于Avro是一种强类型的数据格式,avsc提供了丰富的类型系统来确保正确的数据序列化和反序列化。这包括基本类型(如int、long、float等)、复合类型(如array、map、union)以及记录和枚举。您还可以定义自定义类型,以便在您的应用程序中重复使用。

4. BSON:一种二进制JSON的JavaScript实现

4.1. 简介

4.1.1. 什么是BSON

BSON(Binary JSON)是一种用于序列化文档的二进制格式。它是基于JSON的,但具有一些额外的功能,如更丰富的数据类型支持和更高效的存储方式。BSON被广泛用于MongoDB中存储和传输数据。

4.1.2. 主要功能
  • 嵌套文档支持:BSON允许在文档中嵌套其他文档,提供了更加灵活的数据结构。
  • 数据类型丰富:BSON支持多种数据类型,包括常见的字符串、数字、日期等,还支持特殊类型如正则表达式和二进制数据。
  • 高效的存储方式:BSON采用二进制格式存储数据,相对于JSON的纯文本格式更节省空间和传输时间。

4.2. 安装与使用

4.2.1. 安装方法

可以使用以下命令在Node.js项目中安装BSON库:

npm install bson
4.2.2. 基本用法示例

下面是一个使用BSON库的基本示例代码,演示如何将一个对象序列化为BSON二进制数据,并进行反序列化操作:

const BSON = require('bson');

// 要序列化的JavaScript对象
const obj = { name: 'Alice', age: 30 };

// 序列化对象为BSON二进制数据
const bsonData = BSON.serialize(obj);
console.log(bsonData); // 输出Buffer对象表示的二进制数据

// 反序列化BSON二进制数据为JavaScript对象
const obj2 = BSON.deserialize(bsonData);
console.log(obj2); // 输出 { name: 'Alice', age: 30 }

4.3. 特性与优势

4.3.1. 嵌套文档支持

BSON允许在文档中嵌套其他文档,这使得可以方便地表示复杂的数据结构。例如:

const obj = {
  name: 'Alice',
  address: {
    city: 'New York',
    country: 'USA'
  }
};

在上面的例子中,address字段是一个嵌套文档。使用BSON可以方便地序列化和存储这类复杂数据结构。

4.3.2. 数据类型丰富

BSON支持多种数据类型,除了常见的字符串、数字、日期等类型外,还支持特殊类型如正则表达式和二进制数据。这使得BSON适用于各种应用场景,可以更好地满足不同需求。

5. Thrift:跨语言服务的RPC框架

5.1. 简介

5.1.1. 什么是Thrift

Thrift是一个由Facebook开发的跨语言的、高性能的、轻量级的RPC框架。它通过定义IDL(接口定义语言),实现不同语言之间的数据结构(对象)的序列化和反序列化,同时也提供了一套服务器的框架来处理REQ/REP模式的消息。

Thrift定义了一种IDL文件格式,包含了诸如接口定义、类型定义等信息。然后通过官方提供的编译器(thrift compiler),把这种定义文件转换成各种语言的代码框架。这样,使用这些语言编写的程序就可以通过生成的代码框架来进行通信。

5.1.2. 主要功能
  • 跨语言支持:能够支持多种编程语言,如C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、Objective-C、Cocoa、JavaScript、Node.js、Smalltalk等,方便服务端和客户端的开发。
  • 高性能:采用二进制传输数据,性能高。
  • 接口定义:提供IDL文件定义接口,编译生成代码,自动处理对象序列化。
  • 服务器框架:提供了一套简单易用的服务器框架,方便构建分布式应用。

5.2. 安装与使用

5.2.1. 安装方法
  • 下载安装包:从官方网站(https://thrift.apache.org/download)下载对应的安装包,并解压进行安装。
  • 使用源码编译:从GitHub上克隆源码(https://github.com/apache/thrift),然后进行编译和安装。
5.2.2. 基本用法示例

下面以一个简单的“Hello World”例子来说明如何使用Thrift构建一个RPC服务。首先,定义一个IDL文件hello.thrift:

service HelloService {
    string sayHello(1: string name);
}

然后,使用thrift编译器生成对应语言的代码:

thrift --gen cpp hello.thrift
thrift --gen java hello.thrift

最后,编写服务器端和客户端代码:
服务器端:

class HelloHandler : public HelloServiceIf {
    string sayHello(const string& name) {
        return "Hello " + name;
    }
};

int main() {
    boost::shared_ptr<TProcessor> processor(new HelloServiceProcessor<HelloHandler>());
    boost::shared_ptr<TServerTransport> serverTransport(new TServerSocket(9000));
    boost::shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
    boost::shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
    TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
    server.serve();
    return 0;
}

客户端:

void usage(const char* cmd) {
    cout << "Usage: " << cmd << " host port" << endl;
    exit(1);
}

int main(int argc, char* argv[]) {
    if (argc != 3) {
        usage(argv[0]);
    }
    string host = argv[1];
    int port = atoi(argv[2]);
    boost::shared_ptr<TTransport> socket(new TSocket(host, port));
    boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
    boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
    HelloServiceClient client(protocol);
    transport->open();
    string result = client.sayHello("world");
    cout << result << endl; // outputs "Hello world"
    transport->close();
    return 0;
}

6. CBOR:一种适合于Internet of Things(IoT)的二进制编码格式

6.1. 简介

6.1.1. 什么是CBOR

CBOR(Concise Binary Object Representation)是一种轻量级的二进制编码格式,用于在网络通信和数据交换中传输数据。它是基于JSON的,但使用更少的带宽,并具有更好的性能。CBOR被设计为适用于低功率设备和受限环境中的数据交换,例如物联网(IoT)设备。

CBOR是IETF标准,它定义了紧凑的二进制表示方法,以实现高性能、高效率的数据交换。它支持多种数据类型,包括基本类型(如数字、字符串和数组),以及更复杂的类型(如对象、日期和二进制数据)。

6.1.2. 主要功能
  • 紧凑编码:CBOR使用紧凑的二进制表示方法,能够有效地编码数据,减少传输所需的带宽。
  • 数据类型支持广泛:CBOR支持多种数据类型,包括基本类型和复杂类型,可以满足各种应用场景的需求。
  • 高性能:CBOR使用高效的编码算法,能够在低功耗设备上实现快速的数据序列化和反序列化。

6.2. 安装与使用

6.2.1. 安装方法

您可以使用以下命令通过npm安装CBOR库:

npm install --save cbor
6.2.2. 基本用法示例

下面是一个简单的JavaScript示例代码,展示了如何使用CBOR库来序列化和反序列化一个对象:

const cbor = require('cbor');

// 要序列化的对象
const obj = { foo: 'bar', baz: 42 };

// 将对象序列化为CBOR二进制数据
const serialized = cbor.encode(obj);
console.log(serialized); // <Buffer 0a 02 65 66 6f 6f 65 62 61 72 03 18 2a>

// 将CBOR二进制数据反序列化为对象
const deserialized = cbor.decode(serialized);
console.log(deserialized); // { foo: 'bar', baz: 42 }

总结

这些库在数据序列化和通信方面提供了不同的解决方案,每种库都有其独特的优势和适用场景。根据具体需求选择合适的库可以提高开发效率和系统性能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IBM Spectrum LSF RTM,针对 IBM Spectrum LSF 环境的高级报告、跟踪和监控工具

亮点 为 IBM Spectrum LSF 环境提供性能监控和报告 监控 FlexNet Publisher 和 Reprisebased 许可证的使用&#xff0c;提供详细和总结性报告 通过多个级别&#xff08;包括应用程序和组织&#xff09;的报告来监控共享存储的利用率 提供强大的生产力工具&#xff0c;包括操…

计算机公共课面试常见问题:线性代数篇

目录 1. 特征向量和特征值代表什么含义&#xff1f; 2. 矩阵的秩是什么&#xff1f;满秩代表什么&#xff1f;不满秩呢&#xff1f; 3. 奇异值分解是什么&#xff1f; …

二手房和新房市场冰火两重天!原因为何?杭州给出了答案

随着房市的回暖&#xff0c;也出现了不少的不利的消息&#xff0c;一边二手房被抢购&#xff0c;一边是新房难卖&#xff0c;为何如此矛盾&#xff1f;近期杭州的楼市行情给出了答案。 5月份在诸多政策的刺激下&#xff0c;杭州楼市保持了热度&#xff0c;不过却有点凉风&#…

“论云上自动化运维及其应用”写作框架,软考高级,系统架构设计师

论文真题 云上自动化运维是传统IT运维和DevOps的延伸&#xff0c;通过云原生架构实现运维的再进化。云上自动化运维可以有效帮助企业降低IT运维成本&#xff0c;提升系统的灵活度&#xff0c;以及系统的交付速度&#xff0c;增强系统的可靠性&#xff0c;构建更加安全、可信、…

【SGX系列教程】(三)Intel-SGX 官方示例分析(SampleCode)——Cxx11SGXDemo

文章目录 示例一. Cxx11SGXDemo1.1 README1.2 重点代码分析1.2.1 App/App.cpp1.2.2 App/TrustedLibrary/Libcxx.cpp1.2.3 Enclave.edl1.2.4 Enclave/TrustedLibrary/Libcxx.cpp1.2.5 Enclave/Enclave.cppEnclave.h 1.3 编译执行1.4 总结 示例二. Cxx14SGXDemo示例三. Cxx17SGXD…

SpringBoot集成道历(实现道历日期查询)

官网地址&#xff1a;官网地址https://6tail.cn/calendar/api.html 1、导入依赖 <dependency><groupId>cn.6tail</groupId><artifactId>lunar</artifactId><version>1.3.9</version></dependency><dependency><group…

斜光测距的原理及python实现

1.前言 最近做了一个基于opencv的斜光测距的小项目&#xff0c;东西不多&#xff0c;但是很有意思&#xff0c;值得拿出来学一学。项目里面需要比较精确的定位功能&#xff0c;将前人matlab代码移植到python上&#xff0c;并且做了一些优化&#xff0c;简化逻辑(毕竟我是专业的…

uView 2.0:uni-app生态的利剑出鞘,引领UI框架新纪元

引言 随着移动互联网的快速发展&#xff0c;跨平台应用开发成为了开发者们关注的焦点。uni-app&#xff0c;一个基于Vue.js的跨平台应用开发框架&#xff0c;因其高效、易用的特性而广受欢迎。在uni-app的生态系统中&#xff0c;UI框架的选择对于开发者而言至关重要。今天&…

AI 编程探索- iOS动态标签控件

需求分析&#xff1a; 标签根据文字长度&#xff0c;自适应标签居中显示扩展 超过内容显示范围&#xff0c;需要换行显示&#xff0c;且保持居中显示 AI实现过程 提问&#xff1a; 回答&#xff1a; import UIKit import SnapKitclass DynamicLabelsContainerView: UIView…

docker 多网卡指定网卡出网

前言 宿主机中有多个网卡 ens160 192.168.4.23/20 内网通信用 ens192 10.31.116.128/24 出公网访问-1 ens193 10.31.116.128/24 出公网访问-2 现在需要不同容器中不同出网访问&#xff0c;举例 容器1 192.168.0.1/20 网段走宿主机 ens160网卡&#xff0c;否则全部走ens192 网…

CAS自旋解析

CAS全称CompareAndSwap(比较并交换)&#xff0c;是cpu的指令&#xff0c;调用时不涉及上下文的切换。Java中属于乐观锁的一种&#xff0c;具体流程如下图&#xff1a; 具体的实现使用的是Unsafe类去调用native修饰的compareAndSwap方法&#xff0c;4个字段分别是对象实例&#…

Shell编程实战

脚本编程步骤 脚本编程一般分为以下几个步骤: 需求分析:根据系统管理的需求&#xff0c;分析脚本要实现的功能、功能实现的层次、实现的命令与语句等; 命令测试:将要用到的命令逐个进行测试&#xff0c;以决定使用的选项、要设置的变量等: 脚本编程:将测试好的命令写入到脚本文…

庆祝东兴市金顺心贸易有限公司代理越南三原竹系列产品五周年

&#x1f389;庆祝金顺心贸易代理越南三原竹系列产品五周年&#xff01;这五年&#xff0c;我们共同成长&#xff0c;每一份产品都承载着越南的美味与匠心。感恩有你们&#xff0c;未来的路&#xff0c;我们继续携手前行&#xff0c;品味更多美好&#xff01;&#x1f962;&…

电子名片小程序源码系统 前后端分离 带完整的安装代码包以及搭建教程

系统概述 电子名片小程序源码系统是一款基于前后端分离架构的综合性平台&#xff0c;旨在为用户提供一个集销售名片和企业商城于一体的解决方案。该系统采用先进的技术手段&#xff0c;实现了个性化名片设计、便捷的销售功能、企业商城模块等一系列实用功能。同时&#xff0c;…

vue-cli 搭建项目

创建 router 目录 在一个.js文件中添加 打开外部命令 打开外部命令后&#xff0c;在指令栏输入npm i vue-router3.5.3 &#xff0c;等待下载 下载完成后 在 main.js 中配置路由 输入这些后&#xff0c;基本的配置就实现了 最后进行测试&#xff0c;验证是否配置 或者打开外部命…

springcloud第4季 分布式事务seata作用服务搭建1

一 seata作用 1.1 seata简介 1.seata是一款解决分布式事务的解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 1.2 seata的术语 一个中心&#xff1a;全局事务id&#xff0c;xid&#xff0c;在调用服务链路的上下文中进行传播。TC(Transa…

iPhone怎么恢复删除的数据?几款顶级iPhone数据恢复软件

从iOS设备恢复数据。 对于任何数据恢复软件来说&#xff0c;从iOS设备恢复数据都是一项复杂的任务&#xff0c;因为Apple已将众多数据保护技术集成到现代iPhone和iPad中。其中包括硬件加密和文件级加密。iOS 上已删除的数据只能通过取证文件工件搜索来找到&#xff0c;例如分析…

最新扣子(Coze)实战案例:图像流工具之空间风格化,完全免费教程

&#x1f9d9;‍♂️ 大家好&#xff0c;我是斜杠君&#xff0c;手把手教你搭建扣子AI应用。 &#x1f4dc; 本教程是《AI应用开发系列教程之扣子(Coze)实战教程》&#xff0c;完全免费学习。 &#x1f440; 关注斜杠君&#xff0c;可获取完整版教程。&#x1f44d;&#x1f3f…

EHS,制造业安全绿色生产的隐形守护神

当我们提到EHS&#xff0c;可能很多人会稍感陌生&#xff0c;毕竟它不是一个日常生活中经常提及的词汇。但实际上&#xff0c;EHS在我们的生活和工作中扮演着极其重要的角色&#xff0c;尤其对制造业而言更是可持续发展经营管理的重中之重。 一、EHS是什么意思&#xff1f; E…

vue项目内网部署流程

由于第一次部署&#xff0c;也是第一次自己用 Nginx , 百度了很久&#xff0c;没有看到想看的步骤&#xff0c;所以作此文以记录&#xff0c;也是给像我一样的人一个大概方向。 注&#xff1a;windows系统 1、首先要弄好jar包的运行环境。 安装jdk 详细安装过程引用 jdk的完整…