UNPKG

@jaisocx/objdata

Version:

ObjData represents the Objects and array and arrays of objects, where no parsing by bytewise chars comparisons are not used (XML and Json are in all text IDEs readable/writable, and use comaparisons of chars), and the instantiating a JavaScript Object ins

146 lines (131 loc) 5.53 kB
class ObjDataSerializer { static serialize(anyValue) { return ObjDataSerializer.serializeProperty( "Root", anyValue ); } static serializeProperty( propName, propValue ) { let propertyNameSerialized = new Uint8Array(); let propertyValueSerialized = new Uint8Array(); let dataHelper = new ObjDataHelpingProps(); let dataType = typeof propValue; if ((dataType === "object") && (Array.isArray(propValue))) { dataType = "array"; } if (typeof propName === "number") { propertyNameSerialized = new Uint8Array(ObjDataConstants.FIELDS_POINTERS.PROPERTY_NAME_LENGTH_FIELD_LEN); ObjDataPackage.serializeNumberToByteBuf( propName, ObjDataConstants.FIELDS_POINTERS.PROPERTY_NAME_LENGTH_FIELD_LEN, 0, propertyNameSerialized ); } else if (typeof propName === "string") { propertyNameSerialized = ObjDataPackage.serializeTextToByteBuf(propName); } if (dataType === "number") { dataHelper.datatype = ObjDataConstants.DATA_TYPES.NUMBER; propertyValueSerialized = new Uint8Array(4); ObjDataPackage.serializeNumberToByteBuf( propValue, 4, 0, propertyValueSerialized ); } else if (dataType === "string") { dataHelper.datatype = ObjDataConstants.DATA_TYPES.TEXT_PLAIN; propertyValueSerialized = ObjDataPackage.serializeTextToByteBuf(propValue); } else if (dataType === "boolean") { dataHelper.datatype = ObjDataConstants.DATA_TYPES.NUMBER; propertyValueSerialized = new Uint8Array(1); propertyValueSerialized[0] = propValue ? 1 : 0; } else if (dataType === "object") { dataHelper.datatype = ObjDataConstants.DATA_TYPES.OBJECT; let objectKeys = Object.keys(propValue); dataHelper.propsAmount = objectKeys.length; const byteBufs = []; for (let subPropName of objectKeys) { const subPropValue = propValue[subPropName]; const subPropValueSerialized = ObjDataSerializer.serializeProperty( subPropName, subPropValue ); byteBufs.push(subPropValueSerialized); } propertyValueSerialized = ObjDataPackage.concatByteArrays(byteBufs); } else if (dataType === "array") { dataHelper.datatype = ObjDataConstants.DATA_TYPES.ARRAY; dataHelper.propsAmount = propValue.length; const byteBufs = []; for (let i = 0; i < dataHelper.propsAmount; i++) { const subPropValue = propValue[i]; const subPropValueSerialized = ObjDataSerializer.serializeProperty( i, subPropValue ); byteBufs.push(subPropValueSerialized); } propertyValueSerialized = ObjDataPackage.concatByteArrays(byteBufs); } else { dataHelper.datatype = ObjDataConstants.DATA_TYPES.BINARY; propertyValueSerialized = new Uint8Array(1); propertyValueSerialized[0] = 127; } dataHelper.propertyNameLength = propertyNameSerialized.length; dataHelper.propertyValueStart = dataHelper.propertyNameStart + dataHelper.propertyNameLength; dataHelper.propertyValueLength = propertyValueSerialized.length; dataHelper.lengthAll = ((ObjDataConstants.FIELDS_POINTERS.HEADERS_LENGTH) + (dataHelper.propertyNameLength) + (dataHelper.propertyValueLength)); const headers = ObjDataSerializer.serializePropHeaders(dataHelper); return ObjDataPackage.concatByteArrays([ headers, propertyNameSerialized, propertyValueSerialized ]); } static serializePropHeaders(dataHelper) { const headersBuf = new Uint8Array(ObjDataConstants.FIELDS_POINTERS.HEADERS_LENGTH); ObjDataPackage.serializeNumberToByteBuf( dataHelper.lengthAll, ObjDataConstants.FIELDS_POINTERS.LENGTH_ALL_FIELD_LEN, ObjDataConstants.FIELDS_POINTERS.LENGTH_ALL, headersBuf ); ObjDataPackage.serializeNumberToByteBuf( dataHelper.datatype, ObjDataConstants.FIELDS_POINTERS.DATATYPE_FIELD_LEN, ObjDataConstants.FIELDS_POINTERS.DATATYPE, headersBuf ); ObjDataPackage.serializeNumberToByteBuf( dataHelper.numberValueUnit, ObjDataConstants.FIELDS_POINTERS.NUMBER_VALUE_UNIT_FIELD_LEN, ObjDataConstants.FIELDS_POINTERS.NUMBER_VALUE_UNIT, headersBuf ); ObjDataPackage.serializeNumberToByteBuf( dataHelper.propsAmount, ObjDataConstants.FIELDS_POINTERS.PROPS_AMOUNT_FIELD_LEN, ObjDataConstants.FIELDS_POINTERS.PROPS_AMOUNT, headersBuf ); ObjDataPackage.serializeNumberToByteBuf( dataHelper.propertyNameLength, ObjDataConstants.FIELDS_POINTERS.PROPERTY_NAME_LENGTH_FIELD_LEN, ObjDataConstants.FIELDS_POINTERS.PROPERTY_NAME_LENGTH, headersBuf ); return headersBuf; } }