private Array DeserializeArray(TypeModel typeModel, int vectorLength, int vectorStart)
        {
            var elementType = typeModel.Type.GetElementType();

            if (elementType == null)
            {
                throw new NotSupportedException();
            }

            var array = Array.CreateInstance(elementType, vectorLength);

            var elementTypeModel = _typeModelRegistry.GetTypeModel(elementType);
            var elemmentSize     = elementTypeModel.IsReferenceType ? BaseType.Struct.SizeOf() : typeModel.ElementType.SizeOf();

            for (var i = 0; i < vectorLength; ++i)
            {
                object value    = null;
                var    valuePos = vectorStart + i * elemmentSize;

                if (elementTypeModel.IsReferenceType)
                {
                    value = DeserializeElementReferenceType(valuePos, elementTypeModel);
                }
                else
                {
                    value = DeserializeScalarValue(typeModel.ElementType, valuePos);
                }

                array.SetValue(value, i);
            }

            return(array);
        }
 public SerializationContext(TypeModelRegistry typeModelRegistry, object rootObject, FlatBufferBuilder builder)
 {
     _typeModelRegistry = typeModelRegistry;
     _rootObject        = rootObject;
     _rootTypeModel     = _typeModelRegistry.GetTypeModel(rootObject.GetType());
     _builder           = builder;
 }
        /// <summary>
        /// Writes a schema fragment of a type
        /// </summary>
        /// <param name="type">Type to emit</param>
        public void Write(Type type)
        {
            var typeModel = _typeModelRegistry.GetTypeModel(type);

            if (typeModel == null)
            {
                throw new ArgumentException("Could not determine TypeModel for TypeModel");
            }
            Write(typeModel);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Returns the <see cref="TypeModel"/> for this models ElementType
        /// </summary>
        /// <returns>Returns the ElementType TypeModel</returns>
        public TypeModel GetElementTypeModel()
        {
            var elementType = _clrType.GetElementType();

            if (elementType != null)
            {
                return(_registry.GetTypeModel(elementType));
            }
            else if (_clrType.IsGenericType)
            {
                var a = _clrType.GetGenericArguments();

                if (a.Length > 0)
                {
                    return(_registry.GetTypeModel(_clrType.GetGenericArguments()[0]));
                }
            }

            return(null);
        }
        private int SerializeVector(ICollection collection)
        {
            var elementType      = TypeHelpers.GetEnumerableElementType(collection.GetType());
            var elementTypeModel = _typeModelRegistry.GetTypeModel(elementType);

            _builder.StartVector(elementTypeModel.InlineSize, collection.Count, elementTypeModel.InlineAlignment);

            foreach (var element in collection)
            {
                if (elementTypeModel.IsReferenceType)
                {
                    _builder.AddOffset(_objectOffsets[element]);
                }
                else
                {
                    SerializeInlineValue(element, elementTypeModel);
                }
            }

            return(_builder.EndVector().Value);
        }
 public DeserializationContext(TypeModelRegistry typeModelRegistry, Type rootObjectType, ByteBuffer buffer)
 {
     _typeModelRegistry = typeModelRegistry;
     _rootTypeModel     = _typeModelRegistry.GetTypeModel(rootObjectType);
     _buffer            = buffer;
 }
        /// <summary>
        /// Adds a .NET type to the schema. Type will be reflected into a <see cref="TypeModel"/>
        /// </summary>
        /// <param name="type">The type to add to the schema</param>
        /// <returns>A dependency node for the type</returns>
        public FlatBuffersSchemaTypeDependencyNode AddType(Type type)
        {
            var typeModel = _typeModelRegistry.GetTypeModel(type);

            return(AddType(typeModel));
        }