예제 #1
0
        private void SerializeValue(SerializationContext context, RosBinaryWriter writer, RosType rosType, Type type,
                                    object value)
        {
            if (rosType.IsBuiltIn)
            {
                writer.WriteBuiltInType(rosType, value);
            }
            else
            {
                var typeInfo = context.MessageTypeRegistry.GetOrCreateMessageTypeInfo(type);
                IRosMessageFormatter formatter = this;

                // If this serializer cannot serialize the object search for serializer who can do it
                if (!CanSerialize(typeInfo))
                {
                    formatter = context.MessageFormatters.FindFormatterFor(typeInfo);

                    if (formatter == null)
                    {
                        throw new NotSupportedException($"No formatter for message {typeInfo} found.");
                    }
                }

                formatter.Serialize(context, writer, typeInfo, value);
            }
        }
예제 #2
0
        public void Serialize(SerializationContext context, RosBinaryWriter writer, IRosMessageTypeInfo messageTypeInfo,
                              object o)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (o == null)
            {
                throw new ArgumentNullException(nameof(o));
            }

            if (!(messageTypeInfo is DescriptorBasedMessageTypeInfo messageInfo))
            {
                throw new NotSupportedException("MessageTypeInfo is no DescriptorBasedMessageTypeInfo");
            }

            var fields = messageInfo.MessageDescriptor.Fields;

            foreach (var field in fields)
            {
                try
                {
                    var value = field.GetValue(o);

                    if (field.RosType.IsArray)
                    {
                        SerializeArray(context, writer, field.RosType, field.Type, value);
                    }
                    else
                    {
                        SerializeValue(context, writer, field.RosType, field.Type, value);
                    }
                }
                catch (Exception e)
                {
                    if (e is RosFieldSerializationException rosException)
                    {
                        rosException.AddLeadingRosIdentifier(field.RosIdentifier);
                        throw;
                    }
                    else
                    {
                        throw new RosFieldSerializationException(RosFieldSerializationException.SerializationOperation.Serialize, field.RosIdentifier, e);
                    }
                }
            }
        }
        public void Serialize(object message, Stream output)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }
            if (output == null)
            {
                throw new ArgumentNullException(nameof(output));
            }

            var messageTypeInfo = MessageTypeRegistry.GetOrCreateMessageTypeInfo(message.GetType());
            var formatter       = GetFormatter(messageTypeInfo);
            var context         = new SerializationContext(output, MessageFormatters, MessageTypeRegistry);
            var writer          = new RosBinaryWriter(output);

            formatter.Serialize(context, writer, messageTypeInfo, message);
        }
예제 #4
0
        private void SerializeArray(SerializationContext context, RosBinaryWriter writer, RosType rosType, Type memberType,
                                    object value)
        {
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            var collection = value as ICollection;

            if (collection == null)
            {
                throw new InvalidCastException("Value does not implement System.ICollection.");
            }

            var elementCount = collection.Count;

            if (rosType.IsFixedSizeArray)
            {
                if (rosType.ArraySize != elementCount)
                {
                    throw new InvalidOperationException(
                              $"Expected array size of {rosType.ArraySize} but found array size of {elementCount}.");
                }
            }
            else
            {
                writer.Write(elementCount);
            }

            if (elementCount == 0)
            {
                return;
            }

            var elementType = GetGenericElementType(memberType);

            var index = -1;

            foreach (var item in collection)
            {
                index++;

                try
                {
                    SerializeValue(context, writer, rosType, elementType, item);
                }
                catch (Exception e)
                {
                    var indexString = $"[{index}]";
                    if (e is RosFieldSerializationException rosException)
                    {
                        rosException.AddLeadingRosIdentifier(indexString);
                        throw;
                    }
                    else
                    {
                        throw new RosFieldSerializationException(RosFieldSerializationException.SerializationOperation.Serialize, indexString, e);
                    }
                }
            }
        }