in iothub/device/src/Transport/AmqpIot/AmqpIotMessageConverter.cs [427:509]
private static bool TryGetAmqpObjectFromNetObject(object netObject, MappingType mappingType, out object amqpObject)
{
amqpObject = null;
if (netObject == null)
{
return true;
}
switch (SerializationUtilities.GetTypeId(netObject))
{
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:
amqpObject = netObject;
break;
case PropertyValueType.Stream:
if (mappingType == MappingType.ApplicationProperty)
{
amqpObject = ReadStream((Stream)netObject);
}
break;
case PropertyValueType.Uri:
amqpObject = new DescribedType((AmqpSymbol)UriName, ((Uri)netObject).AbsoluteUri);
break;
case PropertyValueType.DateTimeOffset:
amqpObject = new DescribedType((AmqpSymbol)DateTimeOffsetName, ((DateTimeOffset)netObject).UtcTicks);
break;
case PropertyValueType.TimeSpan:
amqpObject = new DescribedType((AmqpSymbol)TimeSpanName, ((TimeSpan)netObject).Ticks);
break;
case PropertyValueType.Unknown:
if (netObject is Stream netStream)
{
if (mappingType == MappingType.ApplicationProperty)
{
amqpObject = ReadStream(netStream);
}
}
else if (mappingType == MappingType.ApplicationProperty)
{
throw FxTrace.Exception.AsError(
new SerializationException(
IotHubApiResources.GetString(ApiResources.FailedToSerializeUnsupportedType, netObject.GetType().FullName)));
}
else if (netObject is byte[] netObjectBytes)
{
amqpObject = new ArraySegment<byte>(netObjectBytes);
}
else if (netObject is IList)
{
// Array is also an IList
amqpObject = netObject;
}
else if (netObject is IDictionary netObjectDictionary)
{
amqpObject = new AmqpMap(netObjectDictionary);
}
break;
default:
break;
}
return amqpObject != null;
}