in src/Azure.IIoT.OpcUa/src/Encoders/JsonDecoderEx.cs [693:824]
public Array? ReadArray(string? fieldName, int valueRank, BuiltInType builtInType,
Type? systemType, ExpandedNodeId? encodeableTypeId)
{
if (valueRank == ValueRanks.OneDimension)
{
switch (builtInType)
{
case BuiltInType.Boolean:
return ReadBooleanArray(fieldName).ToArray();
case BuiltInType.SByte:
return ReadSByteArray(fieldName).ToArray();
case BuiltInType.Byte:
return ReadByteArray(fieldName).ToArray();
case BuiltInType.Int16:
return ReadInt16Array(fieldName).ToArray();
case BuiltInType.UInt16:
return ReadUInt16Array(fieldName).ToArray();
case BuiltInType.Int32:
return ReadInt32Array(fieldName).ToArray();
case BuiltInType.UInt32:
return ReadUInt32Array(fieldName).ToArray();
case BuiltInType.Int64:
return ReadInt64Array(fieldName).ToArray();
case BuiltInType.UInt64:
return ReadUInt64Array(fieldName).ToArray();
case BuiltInType.Float:
return ReadFloatArray(fieldName).ToArray();
case BuiltInType.Double:
return ReadDoubleArray(fieldName).ToArray();
case BuiltInType.String:
return ReadStringArray(fieldName).ToArray();
case BuiltInType.DateTime:
return ReadDateTimeArray(fieldName).ToArray();
case BuiltInType.Guid:
return ReadGuidArray(fieldName).ToArray();
case BuiltInType.ByteString:
return ReadByteStringArray(fieldName).ToArray();
case BuiltInType.XmlElement:
return ReadXmlElementArray(fieldName).ToArray();
case BuiltInType.NodeId:
return ReadNodeIdArray(fieldName).ToArray();
case BuiltInType.ExpandedNodeId:
return ReadExpandedNodeIdArray(fieldName).ToArray();
case BuiltInType.StatusCode:
return ReadStatusCodeArray(fieldName).ToArray();
case BuiltInType.QualifiedName:
return ReadQualifiedNameArray(fieldName).ToArray();
case BuiltInType.LocalizedText:
return ReadLocalizedTextArray(fieldName).ToArray();
case BuiltInType.DataValue:
return ReadDataValueArray(fieldName).ToArray();
case BuiltInType.Enumeration:
return ReadInt32Array(fieldName).ToArray();
case BuiltInType.Variant:
return ReadVariantArray(fieldName).ToArray();
case BuiltInType.ExtensionObject:
return ReadExtensionObjectArray(fieldName).ToArray();
case BuiltInType.DiagnosticInfo:
return ReadDiagnosticInfoArray(fieldName).ToArray();
default:
throw new DecodingException(
$"Cannot decode unknown type in Array object with BuiltInType: {builtInType}.");
}
}
else if (valueRank > ValueRanks.OneDimension)
{
if (!ReadArrayField(fieldName, out var array))
{
return null;
}
var elements = new List<object>();
var dimensions = new List<int>();
ReadMatrixPart(fieldName, array, builtInType, ref elements, ref dimensions, 0);
switch (builtInType)
{
case BuiltInType.Boolean:
return new Matrix(elements.Cast<bool>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.SByte:
return new Matrix(elements.Cast<sbyte>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.Byte:
return new Matrix(elements.Cast<byte>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.Int16:
return new Matrix(elements.Cast<short>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.UInt16:
return new Matrix(elements.Cast<ushort>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.Int32:
return new Matrix(elements.Cast<int>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.UInt32:
return new Matrix(elements.Cast<uint>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.Int64:
return new Matrix(elements.Cast<long>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.UInt64:
return new Matrix(elements.Cast<ulong>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.Float:
return new Matrix(elements.Cast<float>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.Double:
return new Matrix(elements.Cast<double>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.String:
return new Matrix(elements.Cast<string>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.DateTime:
return new Matrix(elements.Cast<DateTime>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.Guid:
return new Matrix(elements.Cast<Uuid>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.ByteString:
return new Matrix(elements.Cast<byte[]>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.XmlElement:
return new Matrix(elements.Cast<XmlElement>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.NodeId:
return new Matrix(elements.Cast<NodeId>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.ExpandedNodeId:
return new Matrix(elements.Cast<ExpandedNodeId>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.StatusCode:
return new Matrix(elements.Cast<StatusCode>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.QualifiedName:
return new Matrix(elements.Cast<QualifiedName>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.LocalizedText:
return new Matrix(elements.Cast<LocalizedText>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.DataValue:
return new Matrix(elements.Cast<DataValue>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.Enumeration:
return new Matrix(elements.Cast<int>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.Variant:
return new Matrix(elements.Cast<Variant>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.ExtensionObject:
return new Matrix(elements.Cast<ExtensionObject>().ToArray(), builtInType, [.. dimensions]).ToArray();
case BuiltInType.DiagnosticInfo:
return new Matrix(elements.Cast<DiagnosticInfo>().ToArray(), builtInType, [.. dimensions]).ToArray();
}
}
return null;
}