Object manager#

Serialization#

You can register objects with a vtkObjectManager instance and call UpdateStatesFromObjects, GetState(identifier) to obtain a serialized state of the registered objects and all their dependency objects that are serializable.

Deserialization#

You can register a json state (stringified) with a vtkObjectManager instance and call UpdateObjectsFromStates, GetObjectAtId(identifier) to deserialize and retrieve the objects.

Blobs#

All vtkDataArray are hashed and stored as unique blobs to prevent multiple copies of the same data within the state. The contents of a data array within a state are represented with a hash string. You can fetch and register blobs using GetBlob and RegisterBlob.

Dependencies#

You can retrieve all dependent object identifiers using vtkObjectManager::GetAllDependencies(identifier)

Extensions#

You can also (de)serialize classes in custom VTK modules. Simply pass the registrar function to vtkObjectManager::InitializeExtensionModuleHandler(registrar) where the registrar argument is of type vtkSessionObjectManagerRegistrarFunc. In C/C++, this function can be accessed from the vtkModuleNameSerDes.h header file in your build directory. In Python, this function is available as an attribute on the module.

Here are examples:

#include <vtkFooSerDes.h>

vtkNew<vtkObjectManager> manager;
manager->InitializeExtensionModuleHandler(RegisterClasses_vtkFoo);
from vtkmodules import vtkInteractionWidgets
from vtkmodules.vtkSerializationManager import vtkObjectManager
object_manager = vtkObjectManager()
object_manager.InitializeExtensionModuleHandler(vtkInteractionWidgets.RegisterClasses_vtkInteractionWidgets)

Serialization of addon in WASM#

In WASM, you will need to create two directories that resemble this tree. In this illustration, we wish to (de)serialize classes from the Bar and Foo modules in WASM using vtkRemoteSession or vtkStandaloneSession.

The WebAssemblyAsync module is optional. You can leave it out if you are not interested in having WebGPU support.

- Bar
 |- ...
 |- vtk.module
- Foo
 |- ...
 |- vtk.module
- WebAssembly
 |- vtk.module
 |- CMakeLists.txt
- WebAssemblyAsync
 |- vtk.module
 |- CMakeLists.txt

Declare your dependencies in WebAssembly/vtk.module

NAME
  FooBar::WebAssembly
LIBRARY_NAME
  fooBarWebAssembly
PRIVATE_DEPENDS
  VTK::SerializationManager
  VTK::WebAssemblySession
OPTIONAL_DEPENDS
  FooBar::Foo
  FooBar::Bar
  VTK::RenderingContextOpenGL2
  VTK::RenderingOpenGL2
  VTK::RenderingUI
  VTK::RenderingVolumeOpenGL2

Build the module in the WebAssembly/CMakeLists.txt

if (NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
  message(FATAL_ERROR
    "The VTK::WebAssembly module requires Emscripten compiler.")
endif ()

vtk_module_add_serdes_wasm_package(
  MODULE FooBar::WebAssembly
  OUTPUT_NAME fooBarWebAssembly
)

Finally, ensure the WebAssembly/vtk.module is passed to vtk_module_build in your project’s root CMakeLists.txt

If you are interested in WebGPU support, declare your dependencies in WebAssemblyAsync/vtk.module and repeat similar steps as in the non-async section using the new module names.

NAME
  FooBar::WebAssemblyAsync
LIBRARY_NAME
  fooBarWebAssemblyAsync
PRIVATE_DEPENDS
  VTK::SerializationManager
  VTK::WebAssemblySession
OPTIONAL_DEPENDS
  FooBar::Foo
  FooBar::Bar
  VTK::RenderingContextOpenGL2
  VTK::RenderingOpenGL2
  VTK::RenderingUI
  VTK::RenderingVolumeOpenGL2
  VTK::RenderingWebGPU