javascript - Trimiterea unui Uint8Array (BSON) într-un obiect JSON
Folosesc pachetul npm 'bson' în browser pentru a converti/serializa un obiect JSON în BSON. Documentația spune că returnează un buffer Node.js. Documentația Node.js spune că un buffer este de tip 'Uint8Array'. Acum vreau să trimit acest Uint8Array într-un alt obiect JSON (infoJSON), dar JSON nu suportă Uint8Array. Am încercat să convertesc buffer-ul (Uint8Array) într-un array simplu, să-l inserez în obiectul JSON (infoJSON) și apoi să-l convertesc înapoi în Uint8Array direct din obiectul JSON. Dar acest nou Uint8Array nu poate fi deserializat înapoi în obiectul original person (vezi rezultatul). Este corupt.
De ce folosesc BSON? Vreau să împart obiectul original în mai multe bucăți pentru a-l trimite printr-un canal de date WebRTC care are o limitare a dimensiunii datelor. Trebuie să pot identifica fiecare bucată (tipul). Acesta este motivul pentru care folosesc obiecte imbricate.
var personJSON = { 'name': 'sarah' } // JSON
var personBuffer = Bson.serialize(personJSON) // Uint8Array
var personArray = Array.from(personBuffer) // Simple array
var infoJSON = { 'count': 1, 'person': personArray } // Inserting array into JSON
var personUint8Array = Uint8Array.from(infoJSON.person) // Converting array back to Uint8Array
console.log('deserializedObj:')
console.log(Bson.deserialize(personUint8Array))
Rezultat :
Răspuns #1
Aceasta se datorează faptului că Bson.serialize și Bson.deserialize folosesc un obiect Buffer asemănător cu cel din Node.js.
Poți corecta acest lucru folosind ArrayBuffer subiacente pentru a crea un Uint8Array (testează online) și apoi folosește Buffer.from :
var personJSON = { 'name': 'sarah' } // JSON
var personBuffer = new Uint8Array(Bson.serialize(personJSON).buffer) // Uint8Array
var personArray = Array.from(personBuffer) // Simple array
var infoJSON = { 'count': 1, 'person': personArray } // Inserting array into JSON
var personUint8Array = Uint8Array.from(infoJSON.person) // Converting array back to Uint8Array
console.log('deserializedObj:')
console.log(Bson.deserialize(Buffer.from(personBuffer)))
Răspunsul #2
Nu poți trimite date binare sau obiecte care nu sunt JSON printr-un JSON. Dacă vrei să faci asta, atunci îți sugerez să îți codifici unit8array-ul în base64, ceva de genul acesta:
let base64 = btoa(String.fromCharCode.apply(null, personUint8Array));
Acum poți pur și simplu să atașezi acel șir într-un alt JSON și să-l trimiți. Pentru a-l transforma înapoi în unit8Array, pur și simplu fă următoarele:
let personUint8Array = new Unit8Array(atob(base64).split("").map(
(char)=>char.charCodeAt(0)
)
);
Îți sugerez să eviți să încerci să folosești alte tipuri de obiecte decât cele suportate de JSON; dacă ai nevoie să faci asta, atunci probabil nu ai nevoie de formatul JSON.
