in src/Azure.IIoT.OpcUa/src/Encoders/BaseAvroEncoder.cs [760:1194]
public virtual void WriteArray(string? fieldName, object array,
int valueRank, BuiltInType builtInType)
{
var rank = SchemaUtils.GetRank(valueRank);
if (rank == SchemaRank.Collection)
{
switch (builtInType)
{
case BuiltInType.Boolean:
WriteArray(fieldName, (bool[])array, v => WriteBoolean(null, v));
break;
case BuiltInType.SByte:
WriteArray(fieldName, (sbyte[])array, v => WriteSByte(null, v));
break;
case BuiltInType.Byte:
WriteArray(fieldName, (byte[])array, v => WriteByte(null, v));
break;
case BuiltInType.Int16:
WriteArray(fieldName, (short[])array, v => WriteInt16(null, v));
break;
case BuiltInType.UInt16:
WriteArray(fieldName, (ushort[])array, v => WriteUInt16(null, v));
break;
case BuiltInType.Int32:
WriteArray(fieldName, (int[])array, v => WriteInt32(null, v));
break;
case BuiltInType.UInt32:
WriteArray(fieldName, (uint[])array, v => WriteUInt32(null, v));
break;
case BuiltInType.Int64:
WriteArray(fieldName, (long[])array, v => WriteInt64(null, v));
break;
case BuiltInType.UInt64:
WriteArray(fieldName, (ulong[])array, v => WriteUInt64(null, v));
break;
case BuiltInType.Float:
WriteArray(fieldName, (float[])array, v => WriteFloat(null, v));
break;
case BuiltInType.Double:
WriteArray(fieldName, (double[])array, v => WriteDouble(null, v));
break;
case BuiltInType.DateTime:
WriteArray(fieldName, (DateTime[])array, v => WriteDateTime(null, v));
break;
case BuiltInType.Guid:
WriteArray(fieldName, (Uuid[])array, v => WriteGuid(null, v));
break;
case BuiltInType.String:
WriteArray(fieldName, (string[])array, v => WriteString(null, v));
break;
case BuiltInType.ByteString:
WriteArray(fieldName, (byte[][])array, v => WriteByteString(null, v));
break;
case BuiltInType.QualifiedName:
WriteArray(fieldName, (QualifiedName[])array, v => WriteQualifiedName(null, v));
break;
case BuiltInType.LocalizedText:
WriteArray(fieldName, (LocalizedText[])array, v => WriteLocalizedText(null, v));
break;
case BuiltInType.NodeId:
WriteArray(fieldName, (NodeId[])array, v => WriteNodeId(null, v));
break;
case BuiltInType.ExpandedNodeId:
WriteArray(fieldName, (ExpandedNodeId[])array, v => WriteExpandedNodeId(null, v));
break;
case BuiltInType.StatusCode:
WriteArray(fieldName, (StatusCode[])array, v => WriteStatusCode(null, v));
break;
case BuiltInType.XmlElement:
WriteArray(fieldName, (XmlElement[])array, v => WriteXmlElement(null, v));
break;
case BuiltInType.Variant:
// try to write IEncodeable Array
if (array is IEncodeable[] encodeableArray)
{
WriteEncodeableArray(fieldName, encodeableArray,
array.GetType().GetElementType());
return;
}
WriteVariantArray(null, (Variant[])array);
break;
case BuiltInType.Enumeration:
if (array is Enum[] enums)
{
WriteArray(fieldName, enums, v => WriteEnumerated(null, v));
break;
}
else if (array is int[] values)
{
WriteArray(fieldName, values, v => WriteEnumerated(null, v));
break;
}
throw new EncodingException(
"Unexpected type encountered while encoding an Enumeration Array.");
case BuiltInType.ExtensionObject:
WriteArray(fieldName, (ExtensionObject[])array, v => WriteExtensionObject(null, v));
break;
case BuiltInType.DiagnosticInfo:
WriteArray(fieldName, (DiagnosticInfo[])array, v => WriteDiagnosticInfo(null, v));
break;
case BuiltInType.DataValue:
WriteArray(fieldName, (DataValue[])array, v => WriteDataValue(null, v));
break;
default:
// try to write IEncodeable Array
if (array is IEncodeable[] encodeableArray2)
{
WriteEncodeableArray(fieldName, encodeableArray2,
array.GetType().GetElementType());
return;
}
if (array == null)
{
// write zero dimension
WriteInt32(null, -1);
return;
}
throw new EncodingException(
"Unexpected type encountered while encoding an Array with " +
$"BuiltInType: {builtInType}");
}
}
else if (rank == SchemaRank.Matrix)
{
/* Multi-dimensional Arrays are encoded as an Int32 Array containing the dimensions followed by
* a list of all the values in the Array. The total number of values is equal to the
* product of the dimensions.
* The number of values is 0 if one or more dimension is less than or equal to 0.*/
var matrix = array as Matrix;
if (matrix == null)
{
if (array is not Array multiArray || multiArray.Rank != valueRank)
{
// there is no Dimensions to write
WriteInt32("Dimensions", -1);
return;
}
matrix = new Matrix(multiArray, builtInType);
}
// Write the Dimensions
WriteInt32Array(null, matrix.Dimensions);
switch (matrix.TypeInfo.BuiltInType)
{
case BuiltInType.Boolean:
{
var values = (bool[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteBoolean(null, values[ii]);
}
break;
}
case BuiltInType.SByte:
{
var values = (sbyte[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteSByte(null, values[ii]);
}
break;
}
case BuiltInType.Byte:
{
var values = (byte[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteByte(null, values[ii]);
}
break;
}
case BuiltInType.Int16:
{
var values = (short[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteInt16(null, values[ii]);
}
break;
}
case BuiltInType.UInt16:
{
var values = (ushort[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteUInt16(null, values[ii]);
}
break;
}
case BuiltInType.Enumeration:
{
if (matrix.Elements is Enum[] values)
{
for (var ii = 0; ii < values.Length; ii++)
{
WriteEnumerated(null, values[ii]);
}
break;
}
}
{
if (matrix.Elements is int[] values)
{
for (var ii = 0; ii < values.Length; ii++)
{
WriteEnumerated(null, values[ii]);
}
break;
}
}
throw new EncodingException(
"Unexpected type encountered while encoding an Enumeration Matrix.");
case BuiltInType.Int32:
{
var values = (int[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteInt32(null, values[ii]);
}
break;
}
case BuiltInType.UInt32:
{
var values = (uint[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteUInt32(null, values[ii]);
}
break;
}
case BuiltInType.Int64:
{
var values = (long[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteInt64(null, values[ii]);
}
break;
}
case BuiltInType.UInt64:
{
var values = (ulong[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteUInt64(null, values[ii]);
}
break;
}
case BuiltInType.Float:
{
var values = (float[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteFloat(null, values[ii]);
}
break;
}
case BuiltInType.Double:
{
var values = (double[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteDouble(null, values[ii]);
}
break;
}
case BuiltInType.String:
{
var values = (string[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteString(null, values[ii]);
}
break;
}
case BuiltInType.DateTime:
{
var values = (DateTime[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteDateTime(null, values[ii]);
}
break;
}
case BuiltInType.Guid:
{
var values = (Uuid[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteGuid(null, values[ii]);
}
break;
}
case BuiltInType.ByteString:
{
var values = (byte[][])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteByteString(null, values[ii]);
}
break;
}
case BuiltInType.XmlElement:
{
var values = (XmlElement[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteXmlElement(null, values[ii]);
}
break;
}
case BuiltInType.NodeId:
{
var values = (NodeId[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteNodeId(null, values[ii]);
}
break;
}
case BuiltInType.ExpandedNodeId:
{
var values = (ExpandedNodeId[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteExpandedNodeId(null, values[ii]);
}
break;
}
case BuiltInType.StatusCode:
{
var values = (StatusCode[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteStatusCode(null, values[ii]);
}
break;
}
case BuiltInType.QualifiedName:
{
var values = (QualifiedName[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteQualifiedName(null, values[ii]);
}
break;
}
case BuiltInType.LocalizedText:
{
var values = (LocalizedText[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteLocalizedText(null, values[ii]);
}
break;
}
case BuiltInType.ExtensionObject:
{
var values = (ExtensionObject[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteExtensionObject(null, values[ii]);
}
break;
}
case BuiltInType.DataValue:
{
var values = (DataValue[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteDataValue(null, values[ii]);
}
break;
}
case BuiltInType.Variant:
{
if (matrix.Elements is Variant[] variants)
{
for (var ii = 0; ii < variants.Length; ii++)
{
WriteVariant(null, variants[ii]);
}
break;
}
// try to write IEncodeable Array
if (matrix.Elements is IEncodeable[] encodeableArray)
{
for (var ii = 0; ii < encodeableArray.Length; ii++)
{
WriteEncodeable(null, encodeableArray[ii], null);
}
break;
}
if (matrix.Elements is object[] objects)
{
for (var ii = 0; ii < objects.Length; ii++)
{
WriteVariant(null, new Variant(objects[ii]));
}
break;
}
throw new EncodingException(
"Unexpected type encountered while encoding a Matrix.");
}
case BuiltInType.DiagnosticInfo:
{
var values = (DiagnosticInfo[])matrix.Elements;
for (var ii = 0; ii < values.Length; ii++)
{
WriteDiagnosticInfo(null, values[ii]);
}
break;
}
default:
{
// try to write IEncodeable Array
if (matrix.Elements is IEncodeable[] encodeableArray)
{
for (var ii = 0; ii < encodeableArray.Length; ii++)
{
WriteEncodeable(null, encodeableArray[ii], null);
}
break;
}
throw new EncodingException(
"Unexpected type encountered while encoding a Matrix " +
$"with BuiltInType: {matrix.TypeInfo.BuiltInType}");
}
}
}
}