What is the best way to write Serialized Save Data to a file using WebGL
I am attempting to use a WebGL build of a Unity project to download a file that can be passed to other people and then reloaded.
This file, so far, has been created in editor builds using a pretty well documented approach with a custom serialized struct that holds the data to be saved, the system.io filestream, and the BinaryFormatter.Serialize and Deserialize commands. A file created in this way can be used by my current WebGL build load up the proper data. What I am having trouble with is writing this file with WebGL, as the same methods write it to an apparently undownloadable part of an IndexedDB, even with the proper index. Is there a good way to attempt this? I have tried several, but none seem to work properly so I would like to put this out there as a general question. If you are interested in my attempts, I can post the code here as well.
Answer by The_Kakaze · May 21, 2020 at 12:24 PM
For anyone in the future who searches fruitlessly for hours looking for what turns out to be a pretty simple solution in two parts. One, the JSLIB that handles downloads:
mergeInto(LibraryManager.library, {
InitiateDownload: function(fileName, textureData) {
var link = document.createElement(""a"");
link.download = Pointer_stringify(fileName);
link.href = 'data:application/octet-stream;charset=utf-8;base64,'+
Pointer_stringify(textureData); document.body.appendChild(link); link.click(); document.body.removeChild(link); delete link; }, });"
Part two, passing in the data. I accomplished this by using BinaryFormatter to write a file to the IndexedDB and then immediately running File.ReadAllBytes, converting that data ToBase64String, then passing it to the JSLIB method like so:
string saveName = "mySaveData.dat"; string concatinatedFilepath = Application.persistentDataPath + "/" + saveName; byte[] formattedFS = File.ReadAllBytes(concatinatedFilepath); string base64 = System.Convert.ToBase64String(formattedFS); InitiateDownload(saveName, base64);
Much thanks to @Bunny83 for helping me with this in a different thread.