I think one change we should do here, this check should be in `unserializeInt`, this mean switch should have `case 0:` too.
This is useless for old properties but any new will benefits from simpler code.
On other hand, if OXCE add new property then it break BOXCE. Overall current handling work only good for "linear" backward-forward compatibility.
Any "forks" will easy break saves.
I think if better would be split binary data in separate buffers that are loaded by name:
binTiles: AAAAAAMAGAAbAAQAAQABAAEAAQAAAAABAAAAAwD//xwABAABAP//AQABAAAAAAIAAAADAP//GwAEAAEA//8BAAEAAAAAAwAAAAMA//
binExtended:
OXCE_X1: AAAAAAMAGAAbAAQAAQABAAEAAQAAAAABAAAAAwD//xwABAABAP//AQABAAAAAAIAAAADAP//GwAEAAEA//8BAAEAAAAAAwAAAAMA//
OXCE_X2: AAAAAAMAGAAbAAQAAQABAAEAAQAAAAABAAAAAwD//xwABAABAP//AQABAAAAAAIAAAADAP//GwAEAAEA//8BAAEAAAAAAwAAAAMA//
OXCE_X3_V2: AAAAAAMAGAAbAAQAAQABAAEAAQAAAAABAAAAAwD//xwABAABAP//AQABAAAAAAIAAAADAP//GwAEAAEA//8BAAEAAAAAAwAAAAMA//
BOXCE_N2: AAAAAAMAGAAbAAQAAQABAAEAAQAAAAABAAAAAwD//xwABAABAP//AQABAAAAAAIAAAADAP//GwAEAAEA//8BAAEAAAAAAwAAAAMA//
FTA_Z: AAAAAAMAGAAbAAQAAQABAAEAAQAAAAABAAAAAwD//xwABAABAP//AQABAAAAAAIAAAADAP//GwAEAAEA//8BAAEAAAAAAwAAAAMA//
At least now compatibility problems will be reduced to having unique names in all forks.
Question is there is use case where storing size of data is useful? aka 2byte vs 2byte or 4byte. If old code try load it, it do not have enough space it store it it will be truncated anyway.