Вся проблема заключалась в том, что у меня не было никаких точек остановки десериализации объекта. Для решения данной проблемы было принято решение после объявления объекта - хранить байт с количеством ключей. Тогда метод
deserializeObject точно знает, когда ему остановиться.
Обновленный код сериализации объекта
const serializeObject = (obj: object): Buffer => {
let buffer = Buffer.alloc(0);
const entries = Object.entries(obj);
entries.forEach(([key, value]) => {
// Количество ключей
const keysCountBuffer = Buffer.alloc(1);
keysCountBuffer.writeUint8(entries.length);
buffer = Buffer.concat([buffer, keysCountBuffer]);
// Длина ключа
const keyLengthBuffer = Buffer.alloc(1);
keyLengthBuffer.writeUInt8(key.length);
buffer = Buffer.concat([buffer, keyLengthBuffer]);
// Ключ
buffer = Buffer.concat([buffer, Buffer.from(key)]);
if (typeof value === 'number') {
buffer = Buffer.concat([buffer, Buffer.from([DataTypeBytes.NUMBER])]);
const numberValueBuffer = Buffer.alloc(4);
numberValueBuffer.writeInt32LE(value);
buffer = Buffer.concat([buffer, numberValueBuffer]);
} else if (typeof value === 'string') {
buffer = Buffer.concat([buffer, Buffer.from([DataTypeBytes.STRING])]);
const stringLengthBuffer = Buffer.alloc(1);
stringLengthBuffer.writeUInt8(value.length);
buffer = Buffer.concat([buffer, stringLengthBuffer]);
buffer = Buffer.concat([buffer, Buffer.from(value)]);
} else if (typeof value === 'boolean') {
buffer = Buffer.concat([buffer, Buffer.from([DataTypeBytes.BOOLEAN])]);
const boolValueBuffer = Buffer.alloc(1);
boolValueBuffer.writeUInt8(value ? 0x01 : 0x00);
buffer = Buffer.concat([buffer, boolValueBuffer]);
} else if (typeof value === 'object') {
buffer = Buffer.concat([buffer, Buffer.from([DataTypeBytes.OBJECT])]);
buffer = Buffer.concat([buffer, serializeObject(value)]);
} else {
throw new Error(`Unsupported value type: ${typeof value}`);
}
});
return buffer;
}
Обновленный код десериализации объекта
const deserializeObject = (buffer: Buffer): { parsedObject: object; newIndex: number } => {
let index = 0;
const parsedObject: { [key: string]: any } = {};
// Читаем количество ключей
const keysCount = buffer[index++];
for (let keyNum = 0; keyNum < keysCount; keyNum++, index++){
// Читаем длину ключа
const keyLength = buffer[index++];
// Читаем ключ
const key = buffer.slice(index, index + keyLength).toString();
index += keyLength;
// Читаем тип значения
const valueType = buffer[index++];
if (valueType === DataTypeBytes.NUMBER) {
const numberValue = buffer.readInt32LE(index);
parsedObject[key] = numberValue;
index += 4;
} else if (valueType === DataTypeBytes.STRING) {
const stringLength = buffer[index++];
const stringValue = buffer.slice(index, index + stringLength).toString();
parsedObject[key] = stringValue;
index += stringLength;
} else if (valueType === DataTypeBytes.BOOLEAN) {
const booleanValue = buffer[index++] === 0x01;
parsedObject[key] = booleanValue;
} else if (valueType === DataTypeBytes.OBJECT) {
const { parsedObject: nestedObject, newIndex } = deserializeObject(buffer.slice(index));
parsedObject[key] = nestedObject;
index += newIndex;
} else {
throw new Error(`Unsupported value type: ${valueType}`);
}
}
return { parsedObject, newIndex: index - 1 };
}
Уважаемая администрация, пожалуйста, не удаляйте вопрос. Вдруг кому поможет в будущем с сериализацией/десериализацией в бинари