【发布时间】:2018-02-02 20:51:14
【问题描述】:
上下文:我一直在构建一个创建和使用磁力链接的应用程序。我一直在尝试找到一种有效的方法来传输 Querystring 中的 javascript 对象,以便另一方面我可以将其反序列化为保持相同类型的对象。高效我的意思是使用尽可能少的字符/尽可能多地传输数据。我发现我的应用程序在 url 中最多包含 +-1500 个字符。
起初我使用原始的 Querystring npm 包,但这些包可以在反序列化时更改类型,并且在更深层次的对象上效率也非常低。
例如:
var input = { age: 12, name:'piet'};
var qs = querystring.encode(input); // ?age=12&name=piet
var output querystring.decode(qs); // {age: '12', name: 'piet'
然后我尝试使用带和不带base64 的json 字符串化查询字符串。但这给我留下了大部分时间用于简单对象的更大字符串。
var input = { age: 12, name:'piet'};
var qs = encodeURIComponent(JSON.stringify(input)); // "%7B%22age%22%3A12%2C%22name%22%3A%22piet%22%7D"
但这给我留下了可笑的长查询字符串,因为一半的字符被编码并变成了 3 倍长,这几乎是长度的两倍。
base64 编码在这种情况下是一个更好的解决方案:
var input = { age: 12, name:'piet'};
var qs = btoa(JSON.stringify(input)); // eyJhZ2UiOjEyLCJuYW1lIjoicGlldCJ9
我一直在尝试在 Google 上寻找一种有效的算法,但还没有真正找到一个好的解决方案。我一直在研究 msgPack 二进制序列化,那时我还必须使用 base64,它可能以更长的字符串结尾。
对于静态类型的 Querystring 序列化对象,是否有已知更有效的算法?还是我必须自己创建?
我一直在考虑一个简单的查询字符串算法,其工作原理如下:
- 查询字符串顺序很重要,下一点:
- 键以 .显示深度: ?obj&.property="test" = { obj : {property: "test" }}
- 字符串中的第一个字符定义了它的类型:b=boolean, s=string,n=number, (如果需要,等等)
我认为这将导致更有效的查询字符串。但我不是在构建以前已经做过的东西吗?
【问题讨论】:
-
你为什么不只是
JSON.stringify并将其作为查询字符串的一些属性粘贴?全部转义? -
您说您的应用程序创建并使用磁力链接。磁力链接不就是hashed pointer to a file吗?这听起来只是一个常规字符串,而不是 Javascript 对象。您还可以澄清您尝试序列化的对象的深度级别吗?还是您不提前知道它们可能有多深?
标签: javascript typescript serialization query-string