前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输

本文涉及的产品
资源编排,不限时长
无影云电脑个人版,1个月黄金款+200核时
无影云电脑企业版,4核8GB 120小时 1个月
简介: EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。

在Meteor框架中,EJSON(Extended JSON)是一个扩展了标准JSON的库,旨在支持更多的数据类型。标准JSON仅支持字符串、数字、布尔值、数组和对象等基本数据类型,而EJSON允许开发者在Meteor应用中传输更复杂的数据类型,例如DateBinary数据,甚至是自定义对象。

EJSON的核心优势在于其可序列化和反序列化的能力,这使得Meteor在客户端和服务器之间传递复杂数据变得更加便捷和高效。

前文提要:开发环境的搭建 -全局安装或使用容器镜像容器化开发环境下的meteor工程架构解析运行在浏览器端的NoSQL数据库副本-MiniMongo介绍及其前后端数据实时同步示例RPC方法注册及调用-更轻量的服务接口提供方式

在进行数据同步等时,往往需要向前端传递很多类型的数据,但对象的传输一般依赖于js runtime提供的JSON的stringify方法,但这个方法面对未定义toJSON方法的对象,例如Date时,会转化成一个字符串,反序列化parse时无法还原成Date,就可能存在一定的问题,或者每次都需要特殊处理。而Meteor则默认使用EJSON来序列化和反序列化,rpc返回的数据,调用rpc的参数等,都默认支持更多的类型-(例如二进制数据不需要转化成base64),所以了解下它的几个常用方法和如何自定义传输对象是很有用的--毕竟通过共享数据结构是可以提高开发效率的。

1 EJSON的接口

1.1 序列化EJSON.stringify

与标准的JSON.stringify类似,EJSON.stringify将EJSON对象序列化为字符串,但它能够处理更复杂的类型。
用法:

const obj = {
    name: "Meteor", date: new Date() };
const ejsonString = EJSON.stringify(obj);
console.log(ejsonString);

1.2 反序列化EJSON.parse

类似于JSON.parse,它从字符串中解析EJSON对象,支持对复杂类型的正确解析。
用法:

const ejsonString = '{"name":"Meteor","date":{"$date":1633029593494}}';
const parsedObj = EJSON.parse(ejsonString);
console.log(parsedObj);

1.3 对象克隆EJSON.clone

深度克隆一个EJSON对象,确保原始对象与副本完全独立。
用法:

const obj = {
    name: "Meteor", date: new Date() };
const clonedObj = EJSON.clone(obj);

1.4 对象比较EJSON.equals

用于比较两个EJSON对象,支持对日期、二进制数据等复杂数据类型的深度比较。
用法:

const obj1 = {
    name: "Meteor", date: new Date() };
const obj2 = EJSON.clone(obj1);
console.log(EJSON.equals(obj1, obj2)); // true

1.5 EJSON.isBinary

检查给定值是否为EJSON的二进制数据。
用法:

const binary = EJSON.newBinary(10);
console.log(EJSON.isBinary(binary)); // true

1.6 自定义类型注册EJSON.addType

用于定义和注册自定义类型,以便EJSON可以序列化和反序列化这些类型。
用法:

class CustomType {
   
  constructor(value) {
   
    this.value = value;
  }

  // 将自定义类型转换为普通对象
  toJSONValue() {
   
    return {
    value: this.value };
  }

  // 从普通对象恢复自定义类型
  static fromJSONValue(obj) {
   
    return new CustomType(obj.value);
  }
}

// 注册自定义类型
EJSON.addType('CustomType', CustomType);

2 自定义对象的传输

EJSON提供了内置的扩展机制,使得开发者可以轻松地定义自己的对象类型并在客户端与服务器之间传输。要实现自定义对象的传输,开发者需要遵循以下步骤:

2.1 创建自定义类型

创建一个自定义类,并实现两个核心方法:

  • toJSONValue():将对象的实例转换为普通的JSON结构,便于传输。
  • fromJSONValue():从普通的JSON结构重建对象实例。
class Point {
   
  constructor(x, y) {
   
    this.x = x;
    this.y = y;
  }

  // 序列化为JSON
  toJSONValue() {
   
    return {
    x: this.x, y: this.y };
  }

  // 反序列化为Point对象
  static fromJSONValue(obj) {
   
    return new Point(obj.x, obj.y);
  }
}

2.2 注册自定义类型

通过EJSON.addType将自定义类型注册到EJSON系统中。注册后的类型将自动支持序列化和反序列化。

EJSON.addType('Point', Point);

2.3 使用自定义对象传输

一旦自定义类型注册完成,开发者就可以像使用普通EJSON对象一样传输自定义对象。例如,在客户端创建一个Point对象并传输到服务器端。

// 客户端
const point = new Point(5, 10);
const ejsonString = EJSON.stringify(point);

// 服务器端
const receivedPoint = EJSON.parse(ejsonString);
console.log(receivedPoint instanceof Point); // true

通过这种方式,Meteor的EJSON为复杂对象的传输提供了高度的灵活性和可扩展性,允许开发者根据项目需求自由定义自己的数据结构,并确保这些数据在客户端和服务器之间能够无缝传递。

3 结论

EJSON是Meteor框架中一个强大的工具,它扩展了JSON的功能,允许传输更多复杂的数据类型,同时支持自定义对象的序列化与反序列化。通过EJSON,Meteor应用可以轻松处理诸如日期、二进制数据等复杂类型,并提供了灵活的接口来定义和传输自定义对象,极大地增强了数据交互的能力。

相关文章
|
22天前
|
前端开发 数据安全/隐私保护
.自定义认证前端页面
.自定义认证前端页面
8 1
.自定义认证前端页面
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
监控 JavaScript 前端开发
前端的混合之路Meteor篇(六):发布订阅示例代码及如何将Meteor的响应数据映射到vue3的reactive系统
本文介绍了 Meteor 3.0 中的发布-订阅模型,详细讲解了如何在服务器端通过 `Meteor.publish` 发布数据,包括简单发布和自定义发布。客户端则通过 `Meteor.subscribe` 订阅数据,并使用 MiniMongo 实现实时数据同步。此外,还展示了如何在 Vue 3 中将 MiniMongo 的 `cursor` 转化为响应式数组,实现数据的自动更新。
|
2月前
|
JSON 分布式计算 前端开发
前端的全栈之路Meteor篇(七):轻量的NoSql分布式数据协议同步协议DDP深度剖析
本文深入探讨了DDP(Distributed Data Protocol)协议,这是一种在Meteor框架中广泛使用的发布/订阅协议,支持实时数据同步。文章详细介绍了DDP的主要特点、消息类型、协议流程及其在Meteor中的应用,包括实时数据同步、用户界面响应、分布式计算、多客户端协作和离线支持等。通过学习DDP,开发者可以构建响应迅速、适应性强的现代Web应用。
|
1月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
31 0
|
2月前
|
前端开发 JavaScript API
前端的全栈之路Meteor篇(完):关于前后端分离及与各框架的对比,浅析分离之下的潜在耦合
本文探讨了Meteor.js这一全栈JavaScript框架的特点与优势,特别是在前后端分离架构中的应用。Meteor通过共享数据结构和简化全栈开发流程,实现了前后端的紧密协作。文章还对比了其他全栈框架,如Next.js、Nuxt.js等,分析了各自的优势与适用场景,最后讨论了通过定义文档归属者和用户专有数据集简化后端构建及端云数据同步的方法。
|
2月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
142 2
|
2月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
44 0
|
2月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。