Javascript 如何在浏览器web扩展中存储ArrayBuffers?
有时浏览器扩展需要保存一些数据,MDN建议使用Javascript 如何在浏览器web扩展中存储ArrayBuffers?,javascript,google-chrome-extension,local-storage,firefox-addon-webextensions,Javascript,Google Chrome Extension,Local Storage,Firefox Addon Webextensions,有时浏览器扩展需要保存一些数据,MDN建议使用browser.storage.界面(请参阅)。但它说: 值可以是基本类型(例如数字、布尔值和字符串) 或数组类型 通常不可能存储其他类型,例如函数, 日期、RegExp、Set、Map、ArrayBuffer等。其中一些 不受支持的类型将还原为空对象,并且会导致 set()抛出一个错误。这里的确切行为是特定于浏览器的 (见:) 由于我试图存储的数据是包含二进制数据的ArrayBuffers,我想知道是否有一种方法可以存储这样的二进制数据,而不是将其
browser.storage.
界面(请参阅)。但它说:
值可以是基本类型(例如数字、布尔值和字符串)
或数组类型
通常不可能存储其他类型,例如函数,
日期、RegExp、Set、Map、ArrayBuffer等。其中一些
不受支持的类型将还原为空对象,并且会导致
set()抛出一个错误。这里的确切行为是特定于浏览器的
(见:)
由于我试图存储的数据是包含二进制数据的ArrayBuffers,我想知道是否有一种方法可以存储这样的二进制数据,而不是将其来回转换为中间字符串表示形式
对于,它还询问如何使用IndexedDB
持久化/存储ArrayBuffers
,我很想相信可以使用IndexedDB
接口,但我不确定:
ArrayBuffers
应该可以工作,这是目前最高的。但即使是这个答案也受到了不明确/缺乏规范/标准/参考的挑战browser.storage.local
而不是其他数据持久化API,例如localStorage
,因为后者更容易删除其数据IndexedDB
的可靠性
然而,我不能,但我认为如果web扩展缺少存储二进制数据的方法,这将是一件非常缺失的事情。因此,问题是:
**web扩展应该如何存储二进制数据,如ArrayBuffers**
更新
除了引用MDN的警告外,似乎还可以存储ArrayBuffers,
没有这样的问题:
var u8array = new Uint8Array(100);
for(var i=0;i<u8array.length;i++)u8array[i]=i;
var storedPromise =
browser.storage.local.set({"u8arraybuffer":u8array.buffer});
storedPromise.then(()=>{
browser.storage.local.get("u8arraybuffer").then((result)=>{
var u8arrayFromStorage = new Uint8Array(result.u8arraybuffer);
console.log("u8arrayFromStorage",u8arrayFromStorage);
// prints:
// u8arrayFromStorage
// Uint8Array(100) [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, … ]
});
});
var u8array=新的Uint8Array(100);
对于(var i=0;i{
browser.storage.local.get(“u8arraybuffer”)。然后((结果)=>{
var u8arrayFromStorage=新的Uint8Array(result.u8arraybuffer);
console.log(“u8arrayFromStorage”,u8arrayFromStorage);
//印刷品:
//u8arrayFromStorage
//Uint8Array(100)[0,1,2,3,4,5,6,7,8,9,…]
});
});
这似乎表明,确实没有任何问题(?再)存储
browser.storage.local
API中的ArrayBuffer。
也许一个答案可以帮助确认,尽管有MDN警告,但通过
browser.storage存储ArrayBuffer
s是完全可能/允许的。
IndexedDB是100%能够按照规范存储ArrayBuffer的,既可以作为值,也可以作为键。@wOxxOm我提到的答案似乎有些纠结e关于提供支持“ArrayBuffer”的规范,可以存储在IndexedDB中。我是否读错了答案?但更重要的是,正如我在问题中提到的,我不想使用IndexedDB
API(即使它能够将ArrayBuffer作为值/键)它的代价是比browser.storage
API风险更高,当涉及到被浏览器删除的数据时(即,一旦缓存/浏览数据被清除)。1)忽略这个古老的答案,阅读规范,这很容易。2) 至于清算的风险,我认为这不应该成为一个因素,相反,您可能希望教育您的用户,例如显示警告或建议备份数据。3) 至于您的代码,我怀疑它只是将数据转换为引擎盖下的标准阵列,因此您应该检查浏览器配置文件目录中的存储文件,以查看实际存储的内容。IndexedDB 100%能够按照规范存储ArrayBuffer,作为一个值和一个键。@wOxxOm我提到的答案似乎很难提供支持“ArrayBuffer”可以存储在IndexedDB中的规范。我读错答案了吗?然而,更重要的是,正如我在问题中提到的,我不想使用IndexedDB
API(即使它能够作为值/键使用ArrayBuffer),当涉及到浏览器删除数据时(即一旦缓存/浏览数据被清除),它的风险要高于browser.storage
API).1)忽略这个古老的答案,阅读说明书,这很容易。2) 至于清算的风险,我认为这不应该成为一个因素,相反,您可能希望教育您的用户,例如显示警告或建议备份数据。3) 至于您的代码,我怀疑它只是将数据转换为引擎盖下的标准阵列,因此您应该检查浏览器配置文件目录中的存储文件,以查看实际存储的内容。