@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
JavaScript
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;
}
}