@@ -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