Type Serialization
Getting Started
Introduction Overview InstallationUsage
Daemon Managed-client Ipc-protocol Type-serializationReference
Testing ExamplesType Serialization
TypeSerializer converts OPC UA types and v4.0.0 DTOs into JSON-safe arrays for IPC transport, and reconstructs them on the other side.
Conversion Table
| OPC UA Type | JSON Representation |
|---|---|
NodeId |
{"ns": 0, "id": 2259, "type": "numeric"} |
Variant |
{"type": 6, "value": 42, "dimensions": null} |
DataValue |
{"value": 42, "type": 6, "dimensions": null, "statusCode": 0, "sourceTimestamp": "...", "serverTimestamp": "..."} |
QualifiedName |
{"ns": 0, "name": "Server"} |
LocalizedText |
{"locale": "en", "text": "Server"} |
ReferenceDescription |
{"referenceTypeId": {...}, "isForward": true, "nodeId": {...}, "browseName": {...}, "displayName": {...}, "nodeClass": 1, "typeDefinition": {...}} |
BrowseNode |
{"reference": {...}, "children": [...]} |
EndpointDescription |
{"endpointUrl": "...", "securityMode": 1, "securityPolicyUri": "...", ...} |
BuiltinType |
int (enum value) |
NodeClass |
int (enum value) |
BrowseDirection |
int (enum value) |
ConnectionState |
string (enum name: "Connected", "Disconnected", "Broken") |
DateTimeImmutable |
string (ISO 8601) |
null |
null |
| scalars | as-is |
| arrays | recursively serialized |
v4.0.0 DTO Conversion
| DTO | JSON Representation |
|---|---|
SubscriptionResult |
{"subscriptionId": 1, "revisedPublishingInterval": 500.0, "revisedLifetimeCount": 2400, "revisedMaxKeepAliveCount": 10} |
MonitoredItemResult |
{"statusCode": 0, "monitoredItemId": 100, "revisedSamplingInterval": 250.0, "revisedQueueSize": 1} |
CallResult |
{"statusCode": 0, "inputArgumentResults": [0], "outputArguments": [{"type": 6, "value": 42, "dimensions": null}]} |
BrowseResultSet |
{"references": [...], "continuationPoint": "abc123"} |
PublishResult |
{"subscriptionId": 1, "sequenceNumber": 42, "moreNotifications": false, "notifications": [...], "availableSequenceNumbers": [1, 2]} |
BrowsePathResult |
{"statusCode": 0, "targets": [{"targetId": {...}, "remainingPathIndex": 0}]} |
BrowsePathTarget |
{"targetId": {"ns": 2, "id": 100, "type": "numeric"}, "remainingPathIndex": 0} |
TransferResult |
{"statusCode": 0, "availableSequenceNumbers": [1, 2, 3]} |
Variant Dimensions
Multi-dimensional arrays preserve their dimensions through serialization:
$variant = new Variant(BuiltinType::Int32, [1, 2, 3, 4], [2, 2]);
$serialized = $serializer->serializeVariant($variant);
// {"type": 6, "value": [1, 2, 3, 4], "dimensions": [2, 2]}Variant Value Deserialization
Some variant values require type-specific deserialization:
| BuiltinType | Deserialization |
|---|---|
DateTime |
ISO 8601 string → DateTimeImmutable |
NodeId |
Array → NodeId object |
QualifiedName |
Array → QualifiedName object |
LocalizedText |
Array → LocalizedText object |
| All others | Returned as-is |
Programmatic Usage
use PhpOpcua\SessionManager\Serialization\TypeSerializer;
$serializer = new TypeSerializer();
// Generic serialization (handles any supported type)
$json = $serializer->serialize($anyValue);
// Type-specific serialization
$data = $serializer->serializeNodeId($nodeId);
$data = $serializer->serializeDataValue($dataValue);
$data = $serializer->serializeSubscriptionResult($result);
// Type-specific deserialization
$nodeId = $serializer->deserializeNodeId($data);
$dataValue = $serializer->deserializeDataValue($data);
$result = $serializer->deserializeSubscriptionResult($data);
$result = $serializer->deserializeCallResult($data);
$result = $serializer->deserializeBrowseResultSet($data);
$result = $serializer->deserializePublishResult($data);
$result = $serializer->deserializeBrowsePathResult($data);
$result = $serializer->deserializeTransferResult($data);
$result = $serializer->deserializeMonitoredItemResult($data);