Нестандартные механизмы сериализации

В 99% случаев ваши модели будут поддерживать механизм сериализации (поскольку этот механизм поддерживают все объекты AnyLogic, в том числе и библиотечные объекты), а значит, вы сможете сохранять и восстанавливать состояния таких моделей во время моделирования, не выполняя никаких дополнительных действий. Однако же не исключаются те редкие ситуации, когда вам нужно будет самостоятельно внести в модель небольшие изменения для того, чтобы эта модель полностью поддерживала сериализацию.

Как вы знаете, AnyLogic позволяет использовать в моделях объекты любых Java классов. На такие объекты могут ссылаться:

Если вы хотите, чтобы все объекты модели сохраняли и восстанавливали свое состояние, вам нужно либо использовать только сериализуемые классы, либо реализовать свою собственную сериализацию, либо просто исключить эти объекты из сохраняемого состояния.

У параметра, переменной и коллекции есть свойство Сохранять при сохранении состояния модели (этот флажок установлен по умолчанию). Если вы оставите этот флажок установленным, то AnyLogic будет сериализовывать (то есть, сохранять в файле состояния) эти элементы, если тип этих элементов будет одним из следующих:

Сбросив этот флажок, вы говорите AnyLogic, что соответствующий элемент модели не должен сохраняться в файле состояния посредством стандартного механизма сериализации. Вы можете затем задать свой механизм сериализации для таких элементов, объявив две функции в Дополнительном коде типа агентов - владельца этих элементов:

Обратите внимание, что если вы используете для какого-то поля нестандартный механизм сериализации, реализованный в поле Дополнительный код класса (т.e. не графически, и у которого нет флажка Сохранять при сохранении состояния модели, который вы можете сбросить), то вам нужно добавить к объявлению этих полей слово transient (перед именем поля).

У мастера создания нового Java класса теперь есть опция Добавить возможность сохранения в файле состояния - реализовать java.io.Serializable. Если этот флажок будет установлен, то новый класс будет реализовывать интерфейс java.io.Serializable и содержать следующую строку кода:

private static final long serialVersionUID = <какое-то значение>;

где значение играет роль идентификатора класса, который нужно изменять при изменении структуры класса  (например, при добавлении (или удалении) каких-то полей класса). Обратите внимание, что в созданных ранее моделях Java классы не реализовывали по умолчанию этот интерфейс и вам может понадобиться добавить это поле самостоятельно. То же самое касается и вложенных классов, если таковые имеются в ваших моделях.

Java классы, используемые в качестве классов сообщений в диаграммах состояний, должны быть сериализуемыми.

Все ссылки на других агентов (за исключением ссылок на вложенных агентов) должны иметь нестандартную сериализацию и десериализацию (и у соответствующих элементов модели должны быть сброшены флажки Сохранять при сохранении состояния модели).  

Некоторые классы требуют дополнительной нестандартной десериализации для своих объектов, если они были созданы вручную (т.e. в коде) и сохранены в сериализуемых полях (например, в простых переменных или в коллекциях). Такими классами являются:

Обратите внимание, что для всех элементов, добавляемых из палитры, код нестандартной десериализации генерируется автоматически.

Java классы, требующие нестандартной сериализации, т.e. требующие специальной обработки во время процесса сериализации и десериализации должны реализовывать специальные методы со следующими объявлениями (они должны быть точно такими):

    private void writeObject(java.io.ObjectOutputStream out)

        throws IOException;

    private void readObject(java.io.ObjectInputStream in)

        throws IOException, ClassNotFoundException;

Следующее описание заимствовано из документации стандартного Java интерфейса java.io.Serializable: