in iothub/device/src/Transport/AmqpIot/AmqpIotMessageConverter.cs [336:425]
private static bool TryGetNetObjectFromAmqpObject(object amqpObject, MappingType mappingType, out object netObject)
{
netObject = null;
if (amqpObject == null)
{
return true;
}
switch (SerializationUtilities.GetTypeId(amqpObject))
{
case PropertyValueType.Byte:
case PropertyValueType.SByte:
case PropertyValueType.Int16:
case PropertyValueType.Int32:
case PropertyValueType.Int64:
case PropertyValueType.UInt16:
case PropertyValueType.UInt32:
case PropertyValueType.UInt64:
case PropertyValueType.Single:
case PropertyValueType.Double:
case PropertyValueType.Boolean:
case PropertyValueType.Decimal:
case PropertyValueType.Char:
case PropertyValueType.Guid:
case PropertyValueType.DateTime:
case PropertyValueType.String:
netObject = amqpObject;
break;
case PropertyValueType.Unknown:
if (amqpObject is AmqpSymbol amqpSymbol)
{
netObject = amqpSymbol.Value;
}
else if (amqpObject is ArraySegment<byte>)
{
var binValue = (ArraySegment<byte>)amqpObject;
if (binValue.Count == binValue.Array.Length)
{
netObject = binValue.Array;
}
else
{
byte[] buffer = new byte[binValue.Count];
Buffer.BlockCopy(binValue.Array, binValue.Offset, buffer, 0, binValue.Count);
netObject = buffer;
}
}
else if (amqpObject is DescribedType describedType)
{
if (describedType.Descriptor is AmqpSymbol descriptorAmqpSymbol)
{
if (descriptorAmqpSymbol.Equals(UriName))
{
netObject = new Uri((string)describedType.Value);
}
else if (descriptorAmqpSymbol.Equals(TimeSpanName))
{
netObject = new TimeSpan((long)describedType.Value);
}
else if (descriptorAmqpSymbol.Equals(DateTimeOffsetName))
{
netObject = new DateTimeOffset(new DateTime((long)describedType.Value, DateTimeKind.Utc));
}
}
}
else if (mappingType == MappingType.ApplicationProperty)
{
throw FxTrace.Exception.AsError(new SerializationException(
IotHubApiResources.GetString(ApiResources.FailedToSerializeUnsupportedType, amqpObject.GetType().FullName)));
}
else if (amqpObject is AmqpMap map)
{
var dictionary = new Dictionary<string, object>();
foreach (KeyValuePair<MapKey, object> pair in map)
{
dictionary.Add(pair.Key.ToString(), pair.Value);
}
netObject = dictionary;
}
else
{
netObject = amqpObject;
}
break;
}
return netObject != null;
}