Skip to content

Commit dacd487

Browse files
committed
~ fix serialization of structs with array abstract fields
1 parent 9da382b commit dacd487

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

opc-ua-sdk/sdk-core/src/main/java/org/eclipse/milo/opcua/sdk/core/types/DynamicStructCodec.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,16 @@ private Object decodeFieldValue(UaDecoder decoder, StructureField field) {
289289
break;
290290
}
291291
case STRUCT:
292-
value = decoder.decodeStructArray(fieldName, dataTypeId);
292+
if (dataTypeId.equals(NodeIds.Structure) || fieldAllowsSubtyping(field)) {
293+
ExtensionObject[] xoArray = decoder.decodeExtensionObjectArray(fieldName);
294+
295+
value =
296+
Arrays.stream(xoArray)
297+
.map(xo -> (DynamicStruct) xo.decode(decoder.getEncodingContext()))
298+
.toArray(DynamicStruct[]::new);
299+
} else {
300+
value = decoder.decodeStructArray(fieldName, dataTypeId);
301+
}
293302
break;
294303
default:
295304
throw new RuntimeException("codecType: " + typeHint);
@@ -379,7 +388,18 @@ private void encodeFieldValue(UaEncoder encoder, StructureField field, Object va
379388
encoder.encodeEnumArray(fieldName, (UaEnumeratedType[]) value);
380389
break;
381390
case STRUCT:
382-
encoder.encodeStructArray(fieldName, (Object[]) value, dataTypeId);
391+
if (dataTypeId.equals(NodeIds.Structure) || fieldAllowsSubtyping(field)) {
392+
DynamicStruct[] structArray = (DynamicStruct[]) value;
393+
394+
ExtensionObject[] xoArray =
395+
Arrays.stream(structArray)
396+
.map(s -> ExtensionObject.encode(encoder.getEncodingContext(), s))
397+
.toArray(ExtensionObject[]::new);
398+
399+
encoder.encodeExtensionObjectArray(fieldName, xoArray);
400+
} else {
401+
encoder.encodeStructArray(fieldName, (Object[]) value, dataTypeId);
402+
}
383403
break;
384404
default:
385405
throw new RuntimeException("codecType: " + typeHint);

0 commit comments

Comments
 (0)