Почему не удается успешно преобразовать данные из сериализованного формата обратно в их исходное состояние?

Как можно улучшить следующий вопрос: "Я разрабатываю собственный протокол передачи данных на основе Node.js для академических целей. У меня есть структура данных, состоящая из определенных типов сообщений, методов и параметров. Пожалуйста, помогите мне проверить, правильно ли я реализовал сериализатор для данной структуры. Вот мой код."
  • 12 мая 2024 г. 8:50
Ответы на вопрос 2
1. Неудача в успешном преобразовании данных из сериализованного формата обратно может быть вызвана неправильной реализацией процесса десериализации, ошибками в логике обработки данных, неправильным форматом сериализации и десериализации, а также отсутствием синхронизации между сериализацией и десериализацией.

2. Вопрос можно улучшить следующим образом:
"Для академических целей я разрабатываю собственный протокол передачи данных на основе Node.js. У меня есть структура данных, которая включает в себя определенные типы сообщений, методы и параметры. Помогите, пожалуйста, проверить корректность моей реализации сериализатора для данной структуры. Привожу ниже мой код для ознакомления."
Вся проблема заключалась в том, что у меня не было никаких точек остановки десериализации объекта. Для решения данной проблемы было принято решение после объявления объекта - хранить байт с количеством ключей.  Тогда метод 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 };
}


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