# Class SurfaceSerializer

java.lang.Object
com.codename1.surfaces.SurfaceSerializer

public final class SurfaceSerializer extends Object

Serializes surface descriptors to the canonical wire format shared by every port: a compact JSON document plus PNG blobs named by content hash. This class is an internal seam between the core API and the platform bridges -- it is public only because ports live in separate artifacts; apps never call it.

The wire format is versioned (`"v": 1`) and deterministic: node maps preserve build order, state maps are emitted with sorted keys, timeline entries are sorted ascending by date and image names derive from a hash of the PNG bytes (identical art always gets the same name).

- ## Method Summary

  Modifier and Type
  Method
  Description
  `static String`
  `serializeKind(WidgetKind kind)`
  Serializes a widget kind declaration.
  `static String`
  `serializeLiveActivity(LiveActivityDescriptor descriptor, Map<String,Object> state, Map<String,byte[]> imagesOut)`
  Serializes a live activity descriptor together with its initial state.
  `static Map<String,Object>`
  `serializeNodeToMap(SurfaceNode node, Map<String,byte[]> imagesOut)`
  Serializes a bare node tree, with no timeline or activity wrapped around it, collecting any imagery it references.
  `static String`
  `serializeState(Map<String,Object> state)`
  Serializes a state map with sorted keys.
  `static String`
  `serializeTimeline(String kindId, WidgetTimeline timeline, Map<String,byte[]> imagesOut)`
  Serializes a widget timeline.

  ### Methods inherited from class Object

  `clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Method Details

  - ### serializeTimeline

    public static String serializeTimeline(String kindId, WidgetTimeline timeline, Map<String,byte[]> imagesOut)

    Serializes a widget timeline.

    ###### Parameters

    - `kindId`: the widget kind id the timeline belongs to
    - `timeline`: the timeline to serialize
    - `imagesOut`: receives PNG blobs keyed by registered name

    ###### Returns

    the timeline JSON

  - ### serializeLiveActivity

    public static String serializeLiveActivity(LiveActivityDescriptor descriptor, Map<String,Object> state, Map<String,byte[]> imagesOut)

    Serializes a live activity descriptor together with its initial state.

    ###### Parameters

    - `descriptor`: the descriptor to serialize
    - `state`: the initial state map, may be null
    - `imagesOut`: receives PNG blobs keyed by registered name

    ###### Returns

    the descriptor JSON

  - ### serializeState

    public static String serializeState(Map<String,Object> state)

    Serializes a state map with sorted keys.

    ###### Parameters

    - `state`: the state map, may be null

    ###### Returns

    the state JSON

  - ### serializeKind

    public static String serializeKind(WidgetKind kind)

    Serializes a widget kind declaration.

    ###### Parameters

    - `kind`: the kind to serialize

    ###### Returns

    the kind JSON

  - ### serializeNodeToMap

    public static Map<String,Object> serializeNodeToMap(SurfaceNode node, Map<String,byte[]> imagesOut)

    Serializes a bare node tree, with no timeline or activity wrapped around it, collecting any imagery it references.

    The node catalog is the layout vocabulary for anything the platform renders while this app may be off screen. Widgets and live activities are two such things; an intent result snippet is a third, and it reuses this descriptor and the native renderer that already reads it rather than introducing a parallel one. That is the whole reason this method is public: `SurfaceNode#toMap` is package-private, and `com.codename1.intents` needs the same encoding without being handed the node internals.

    ###### Parameters

    - `node`: the node tree to serialize
    - `imagesOut`: receives PNG blobs keyed by the name used in the document

    ###### Returns

    the node descriptor, or null when `node` is null