in iothub/service/src/Messaging/Models/MessageConverter.cs [272:362]
public static bool TryGetNetObjectFromAmqpObject(object amqpObject, MappingType mappingType, out object netObject)
{
netObject = null;
if (amqpObject == null)
{
return false;
}
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)
{
netObject = ((AmqpSymbol)amqpObject).Value;
}
else if (amqpObject is ArraySegment<byte> binValue)
{
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 symbol)
{
if (symbol.Equals((AmqpSymbol)UriName))
{
netObject = new Uri((string)describedType.Value);
}
else if (symbol.Equals((AmqpSymbol)TimeSpanName))
{
netObject = new TimeSpan((long)describedType.Value);
}
else if (symbol.Equals((AmqpSymbol)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;
default:
break;
}
return netObject != null;
}