[开源] 将对象序列化为二进制并可进行反序列化的binary.ts

我们也是这么做的

求教大小端是什么?
其实没有限定nodejs,其它语言自己适配就好了。
我造轮子其中一点就是不习惯protobuffer的协议,我现在这个的协议是json格式的,更符合js的使用

造轮子有几点把:
1、protobuffer在前端太难用了(两年前是够难用的,现在不知道),存在一定使用成本,而且由于在小程序上没法动态new Function,它和后端在性能等方面区别应该很大。
2、protobuffer的协议存在学习成本,就那个proto我看着就很难受。
3、还有一个最重要的就是,丰富自己的知识储备,不动手我怕永远也不够了解它。

其实这个至于好不好用我也不知道,毕竟连我自己都没用,不过轮子我还是会继续造的。

感谢你的回复

:smile:

大端:数据的高字节在内存低地址, 小端:数据的高字节在内存高地址。以0x1234这个整数为例 , 大端的话,12的地址比34低, 小端则12的地址比34高。反正我们用的 是大端格式。

其实用啥端无所谓,只要“包装”和“拆包”的协议一致,就行了。

我对这块不熟,求教这个具体要怎么搞,我在百度搜了都是c++、c#、java怎么搞,js应该如何处理这个东西?
前端:

var buffer = new ArrayBuffer(3);
var view = new DataView(buffer);
view.setUint8(1);
view.setUint8(2);
view.setUint8(3);

websocket.send(buffer);  //伪代码

后端:

var buffer = websocket.on();  //伪代码

var view = new DataView(buffer);
view.getUint8();  //1
view.getUint8();  //2
view.getUint8();  //3

这样子是数据有可能出错的是么

u8哪来的大小端,只有u16,i32之类的

uint8就是单字节的,不存在大小端的说法,大小端是决定数据的字节在内存排布的,单字节当然大小端都是一致的啦。

DataView 本身就已经抹平了大小端的差异了。只要服务端也用的 Node.js 就行。

1赞

:+1:,我知道这大小包是咋回事了,搬运点代码,不用DataView试试去

1赞

java 有大小端问题

如果嫌弃protobuf太重,google还有其他轮子~
推荐flatbuffers库

他的js实现也就1000多行代码,可以参考下https://github.com/google/flatbuffers/blob/master/js/flatbuffers.js

这句话不太对,如果是node.js,DataView帮你抹平了大小端自然可以不用在意,而其他语言写的服务器,你要明确告诉他你是大端还是小端,他才能适配

例如flatbuffers,它明确规定使用小端

可以看看他的几个函数writeUint16 writeInt32 都没用DataView,而是直接操作字节,转换为小端的字节序列存到Uint8Array里

是,我当时不知道还有大小端这么个事情,我后面把DataView给去掉了,也是直接操作字节了,不过我没有发出来。