Сериализация и десериализация в localStorage

LocalStorage предоставляет возможность сохранять данные в браузере на стороне клиента в формате строк. Любые объекты JavaScript, включая модели нейронных сетей Brain.js, необходимо предварительно преобразовать в строку, прежде чем помещать их в localStorage. Этот процесс называется сериализацией. В обратном порядке, когда данные извлекаются из localStorage, выполняется десериализация — преобразование строки обратно в объект, пригодный для работы.

Сериализация модели Brain.js

Модели Brain.js представляют собой объекты, содержащие внутренние веса, настройки и состояние сети. Для их сохранения используется метод toJSON():

const brain = require('brain.js');
const net = new brain.NeuralNetwork();

// Обучение сети на примере
net.train([
  { input: [0, 0], output: [0] },
  { input: [0, 1], output: [1] },
  { input: [1, 0], output: [1] },
  { input: [1, 1], output: [0] },
]);

// Сериализация в JSON
const jsonModel = JSON.stringify(net.toJSON());
localStorage.setItem('brainModel', jsonModel);

Ключевые моменты:

  • Метод toJSON() возвращает объект с полным состоянием нейронной сети, включая веса, количество скрытых слоев и функции активации.
  • JSON.stringify() преобразует объект в строку, совместимую с localStorage.
  • localStorage.setItem(key, value) сохраняет строку по указанному ключу.

Десериализация модели Brain.js

Для восстановления сети из сохраненного состояния используется метод fromJSON():

const savedModel = localStorage.getItem('brainModel');

if (savedModel) {
  const netRestored = new brain.NeuralNetwork();
  netRestored.fromJSON(JSON.parse(savedModel));
  
  // Проверка работы восстановленной сети
  const output = netRestored.run([1, 0]);
  console.log(output);
}

Особенности:

  • localStorage.getItem(key) возвращает строку или null, если ключ не найден.
  • JSON.parse() преобразует строку обратно в объект.
  • fromJSON() полностью восстанавливает внутреннее состояние сети, включая обученные веса.

Практические рекомендации

  1. Проверка наличия данных. Всегда проверять, что данные извлечены успешно, чтобы избежать ошибок при десериализации.
  2. Версионирование моделей. Если структура сети может изменяться, стоит хранить версию модели вместе с JSON, чтобы корректно обрабатывать старые форматы.
  3. Размер данных. localStorage ограничен примерно 5 МБ на домен. Для больших сетей может потребоваться сжатие данных (например, с помощью LZString) перед сохранением.
  4. Безопасность и целостность. Проверять JSON на корректность перед восстановлением. Некорректные или поврежденные данные могут привести к ошибкам или некорректной работе сети.

Пример с дополнительной информацией о версии

const modelData = {
  version: 1,
  model: net.toJSON(),
};

localStorage.setItem('brainModelV1', JSON.stringify(modelData));

// При восстановлении
const savedData = JSON.parse(localStorage.getItem('brainModelV1'));
if (savedData && savedData.version === 1) {
  const netRestored = new brain.NeuralNetwork();
  netRestored.fromJSON(savedData.model);
}

Это обеспечивает контроль совместимости и упрощает обновление сети без потери данных.

Сравнение методов хранения

Метод Преимущества Недостатки
localStorage Простота, доступность в браузере Ограничение по размеру (~5 МБ)
IndexedDB Большие объёмы данных, транзакции Сложнее API, требует асинхронного кода
Сжатие + localStorage Позволяет сохранить большие сети Дополнительная обработка, сложнее восстановление

Использование localStorage для сериализации моделей Brain.js является оптимальным решением для небольших сетей, быстрых прототипов и сохранения состояния между сессиями. Десериализация через fromJSON() обеспечивает полное восстановление модели без повторного обучения.