Javascript 如何在浏览器web扩展中存储ArrayBuffers?

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,我想知道是否有一种方法可以存储这样的二进制数据,而不是将其

有时浏览器扩展需要保存一些数据,MDN建议使用
browser.storage.
界面(请参阅)。但它说:

值可以是基本类型(例如数字、布尔值和字符串) 或数组类型

通常不可能存储其他类型,例如函数, 日期、RegExp、Set、Map、ArrayBuffer等。其中一些 不受支持的类型将还原为空对象,并且会导致 set()抛出一个错误。这里的确切行为是特定于浏览器的

(见:)

由于我试图存储的数据是包含二进制数据的ArrayBuffers,我想知道是否有一种方法可以存储这样的二进制数据,而不是将其来回转换为中间字符串表示形式

对于,它还询问如何使用
IndexedDB
持久化/存储
ArrayBuffers
,我很想相信可以使用
IndexedDB
接口,但我不确定:

  • imho表示,由于其结构化克隆的情况,
    ArrayBuffers
    应该可以工作,这是目前最高的。但即使是这个答案也受到了不明确/缺乏规范/标准/参考的挑战
  • MDN提示使用
    browser.storage.local
    而不是其他数据持久化API,例如
    localStorage
    ,因为后者更容易删除其数据
  • 虽然此API*[browser.storage.local](类似于Window.localStorage),但建议使用它 在扩展代码中不使用Window.localStorage。Firefox将 以各种方式清除使用localStorage API的扩展存储的数据 用户清除其浏览历史记录和数据的场景 隐私原因,而使用storage.local API保存的数据将 在这些场景中正确地保持

    这也让我质疑
    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) 至于您的代码,我怀疑它只是将数据转换为引擎盖下的标准阵列,因此您应该检查浏览器配置文件目录中的存储文件,以查看实际存储的内容。