• Почему не срабатывает десериализация?

    @torigetz Автор вопроса
    Вся проблема заключалась в том, что у меня не было никаких точек остановки десериализации объекта. Для решения данной проблемы было принято решение после объявления объекта - хранить байт с количеством ключей. Тогда метод 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 };
    }


    Уважаемая администрация, пожалуйста, не удаляйте вопрос. Вдруг кому поможет в будущем с сериализацией/десериализацией в бинари
    Ответ написан
    Комментировать