Beispiel #1
0
        public object BufferToObject(byte[] buffer)
        {
            Type id = null;

            try
            {
                int readIdCount = _Provider.KeyDescriber.ToObject(buffer, 0, out id);
                if (id == null)
                {
                    return(null);
                }

                ITypeDescriber describer = _Provider.TypeDescriberFinders.Get(id);
                object         instance;
                describer.ToObject(buffer, readIdCount, out instance);
                return(instance);
            }
            catch (DescriberException ex)
            {
                ITypeDescriber describer = _Provider.TypeDescriberFinders.Get(id);
                if (describer != null)
                {
                    throw new SystemException(string.Format("BufferToObject {0}:{1}", id, describer.Type.FullName), ex);
                }
                else
                {
                    throw new SystemException(string.Format("BufferToObject {0}:unkown", id), ex);
                }
            }
        }
Beispiel #2
0
        int ITypeDescriber.GetByteCount(object instance)
        {
            ValidObjectSet set = _GetSet(instance);


            int lenCount   = Varint.GetByteCount(set.TotalLength);
            int validCount = Varint.GetByteCount(set.ValidLength);


            int instanceCount = 0;

            for (int i = 0; i < set.ValidObjects.Length; i++)
            {
                int    index = set.ValidObjects[i].Index;
                object obj   = set.ValidObjects[i].Object;

                ITypeDescriber describer = _TypeSet.Get(obj.GetType());

                instanceCount += Varint.GetByteCount(index);
                instanceCount += _TypeSet.Get().GetByteCount(obj.GetType());
                instanceCount += describer.GetByteCount(obj);
            }

            return(instanceCount + lenCount + validCount);
        }
Beispiel #3
0
        private ManualTypeDescriberBuilder(ManualTypeDescriber other)
        {
            FallbackBehavior      = other.ThrowsOnNoConfiguredType ? ManualTypeDescriberFallbackBehavior.Throw : ManualTypeDescriberFallbackBehavior.UseFallback;
            FallbackTypeDescriber = other.Fallback;

            Builders = ImmutableDictionary.CreateBuilder <TypeInfo, InstanceProvider>();
            foreach (var b in other.Builders)
            {
                Builders[b.Key] = b.Value;
            }

            Serializers = new Dictionary <TypeInfo, ImmutableArray <SerializableMember> .Builder>();
            foreach (var s in other.Serializers)
            {
                var arr = ImmutableArray.CreateBuilder <SerializableMember>();
                arr.AddRange(s.Value);

                Serializers[s.Key] = arr;
            }

            Deserializers = new Dictionary <TypeInfo, ImmutableArray <DeserializableMember> .Builder>();
            foreach (var s in other.Deserializers)
            {
                var arr = ImmutableArray.CreateBuilder <DeserializableMember>();
                arr.AddRange(s.Value);

                Deserializers[s.Key] = arr;
            }
        }
Beispiel #4
0
        int ITypeDescriber.ToBuffer(object instance, byte[] buffer, int begin)
        {
            try
            {
                ValidObjectSet set    = _GetSet(instance);
                int            offset = begin;
                offset += Varint.NumberToBuffer(buffer, offset, set.TotalLength);
                offset += Varint.NumberToBuffer(buffer, offset, set.ValidLength);


                for (int i = 0; i < set.ValidObjects.Length; i++)
                {
                    int    index = set.ValidObjects[i].Index;
                    object obj   = set.ValidObjects[i].Object;
                    offset += Varint.NumberToBuffer(buffer, offset, index);
                    Type           objType   = obj.GetType();
                    ITypeDescriber describer = _TypeSet.Get(objType);
                    offset += _TypeSet.Get().ToBuffer(objType, buffer, offset);
                    offset += describer.ToBuffer(obj, buffer, offset);
                }

                return(offset - begin);
            }
            catch (Exception ex)
            {
                throw new DescriberException(typeof(ArrayDescriber), _Type, "ToBuffer", ex);
            }
        }
Beispiel #5
0
        public byte[] ObjectToBuffer(object instance)
        {
            try
            {
                if (instance == null)
                {
                    return(_NullBuffer());
                }


                Type           type      = instance.GetType();
                ITypeDescriber describer = _Provider.TypeDescriberFinders.Get(type);

                int    idCount     = _Provider.KeyDescriber.GetByteCount(type);
                int    bufferCount = describer.GetByteCount(instance);
                byte[] buffer      = new byte[idCount + bufferCount];
                int    readCount   = _Provider.KeyDescriber.ToBuffer(type, buffer, 0);
                describer.ToBuffer(instance, buffer, readCount);
                return(buffer);
            }
            catch (DescriberException ex)
            {
                if (instance != null)
                {
                    throw new SystemException(string.Format("ObjectToBuffer {0}", instance.GetType()), ex);
                }
                else
                {
                    throw new SystemException(string.Format("ObjectToBuffer null"), ex);
                }
            }
        }
Beispiel #6
0
        /// <summary>
        /// Set the ITypeDescriber used to discover and configure the
        /// columns that are read and written.
        /// </summary>
        public OptionsBuilder WithTypeDescriber(ITypeDescriber describer)
        {
            describer = describer ?? TypeDescribers.Default;

            TypeDescriber = describer;
            return(this);
        }
Beispiel #7
0
        int ITypeDescriber.GetByteCount(object instance)
        {
            try
            {
                var validFields = _Fields.Select(
                    (field, index) => new
                {
                    field,
                    index
                }).Where(validField => object.Equals(_GetDescriber(validField.field).Default, validField.field.GetValue(instance)) == false).ToArray();


                int validCount = Varint.GetByteCount(validFields.Length);
                int count      = 0;
                for (int i = 0; i < validFields.Length; i++)
                {
                    var            validField     = validFields[i];
                    object         value          = validField.field.GetValue(instance);
                    Type           valueType      = value.GetType();
                    int            valueTypeCount = _TypeSet.Get().GetByteCount(valueType);
                    ITypeDescriber describer      = _TypeSet.Get(valueType);
                    int            byteCount      = describer.GetByteCount(value);

                    int indexCount = Varint.GetByteCount(validField.index);
                    count += byteCount + indexCount + valueTypeCount;
                }
                return(count + validCount);
            }
            catch (Exception ex)
            {
                throw new DescriberException(typeof(ClassDescriber), _Type, "GetByteCount", ex);
            }
        }
Beispiel #8
0
        /// <summary>
        /// Set the ITypeDescriber used to discover and configure the
        /// columns that are read and written.
        /// </summary>
        public OptionsBuilder WithTypeDescriber(ITypeDescriber typeDescriber)
        {
            typeDescriber ??= TypeDescribers.Default;

            TypeDescriber = typeDescriber;
            return(this);
        }
Beispiel #9
0
        // fallback itypedescriber

        /// <summary>
        /// Sets the ITypeDescriber to fallback to, provided that FallbackBehavior allows falling back,
        ///   when a method has no registrations to return.
        /// </summary>
        public ManualTypeDescriberBuilder WithFallbackTypeDescriber(ITypeDescriber typeDescriber)
        {
            Utils.CheckArgumentNull(typeDescriber, nameof(typeDescriber));

            FallbackTypeDescriber = typeDescriber;

            return(this);
        }
        /// <summary>
        /// Sets the ITypeDescriber to use to discover providers and members on a surrogate type.
        /// </summary>
        public SurrogateTypeDescriberBuilder WithTypeDescriber(ITypeDescriber typeDescriber)
        {
            Utils.CheckArgumentNull(typeDescriber, nameof(typeDescriber));

            TypeDescriber = typeDescriber;

            return(this);
        }
        /// <summary>
        /// Sets the ITypeDescriber to use when no surrogate type has been registered, provided FallbackBehavior allows it.
        /// </summary>
        public SurrogateTypeDescriberBuilder WithFallbackTypeDescriber(ITypeDescriber fallbackTypeDescriber)
        {
            Utils.CheckArgumentNull(fallbackTypeDescriber, nameof(fallbackTypeDescriber));

            FallbackTypeDescriber = fallbackTypeDescriber;

            return(this);
        }
        private SurrogateTypeDescriberBuilder(ITypeDescriber typeDescribe, ITypeDescriber fallback, SurrogateTypeDescriberFallbackBehavior behavior, ImmutableDictionary <TypeInfo, TypeInfo> .Builder types)
        {
            TypeDescriber         = typeDescribe;
            FallbackTypeDescriber = fallback;
            FallbackBehavior      = behavior;

            SurrogateTypes = types;
        }
Beispiel #13
0
        private ManualTypeDescriberBuilder(ManualTypeDescriberFallbackBehavior behavior, ITypeDescriber fallback)
        {
            FallbackBehavior      = behavior;
            FallbackTypeDescriber = fallback;

            Builders      = ImmutableDictionary.CreateBuilder <TypeInfo, InstanceProvider>();
            Serializers   = new Dictionary <TypeInfo, ImmutableArray <SerializableMember> .Builder>();
            Deserializers = new Dictionary <TypeInfo, ImmutableArray <DeserializableMember> .Builder>();
        }
Beispiel #14
0
        /// <summary>
        /// Create a new SurrogateTypeDescriber.
        /// </summary>
        public SurrogateTypeDescriber(ITypeDescriber surrogateTypeDescriber, bool throwOnNoRegisteredSurrogate)
        {
            if (surrogateTypeDescriber == null)
            {
                Throw.ArgumentNullException(nameof(surrogateTypeDescriber));
            }

            SurrogateTypes = new Dictionary <TypeInfo, TypeInfo>();
            TypeDescriber  = surrogateTypeDescriber;
            ThrowOnNoRegisteredSurrogate = throwOnNoRegisteredSurrogate;
        }
Beispiel #15
0
 public IntKeyDescriber(ITypeDescriber[] describers)
 {
     _Types = new Dictionary <int, Type>();
     _Ids   = new Dictionary <Type, int>();
     for (int i = 0; i < describers.Length; i++)
     {
         int            id  = i + 1;
         ITypeDescriber des = describers[i];
         _Ids.Add(des.Type, id);
         _Types.Add(id, des.Type);
     }
 }
Beispiel #16
0
        public KmlParser(
            Options options,
            IPropertyDescriber propertyDescriber,
            ITypeDescriber typeDescriber
            )
        {
            Options = new ReadOnlyOptions(options);

            this.propertyDescriber = propertyDescriber;
            this.typeDescriber     = typeDescriber;

            typeStart = Options.TypeStart;
        }
 internal ManualTypeDescriber(
     bool throwsOnNonConfiguredType,
     ITypeDescriber fallback,
     ImmutableDictionary <TypeInfo, InstanceProvider> builders,
     ImmutableDictionary <TypeInfo, ImmutableArray <SerializableMember> > serializers,
     ImmutableDictionary <TypeInfo, ImmutableArray <DeserializableMember> > deserializers
     )
 {
     ThrowsOnNoConfiguredType = throwsOnNonConfiguredType;
     Fallback      = fallback;
     Builders      = builders;
     Serializers   = serializers;
     Deserializers = deserializers;
 }
Beispiel #18
0
        int ITypeDescriber.ToObject(byte[] buffer, int begin, out object instance)
        {
            try
            {
                ConstructorInfo constructor = _Type.GetConstructors().OrderBy(c => c.GetParameters().Length).Select(c => c).FirstOrDefault();
                if (constructor != null)
                {
                    Type[]   argTypes = constructor.GetParameters().Select(info => info.ParameterType).ToArray();
                    object[] objArgs  = new object[argTypes.Length];

                    for (int i = 0; i < argTypes.Length; i++)
                    {
                        objArgs[i] = Activator.CreateInstance(argTypes[i]);
                    }
                    instance = Activator.CreateInstance(_Type, objArgs);
                }
                else
                {
                    instance = Activator.CreateInstance(_Type);
                }



                int offset = begin;

                ulong validLength;
                offset += Varint.BufferToNumber(buffer, offset, out validLength);

                for (ulong i = 0ul; i < validLength; i++)
                {
                    ulong index;
                    offset += Varint.BufferToNumber(buffer, offset, out index);
                    Type valueType;
                    offset += _TypeSet.Get().ToObject(buffer, offset, out valueType);
                    FieldInfo      filed     = _Fields[index];
                    ITypeDescriber describer = _TypeSet.Get(valueType);
                    object         valueInstance;
                    offset += describer.ToObject(buffer, offset, out valueInstance);
                    filed.SetValue(instance, valueInstance);
                }

                return(offset - begin);
            }
            catch (Exception ex)
            {
                throw new DescriberException(typeof(ClassDescriber), _Type, "ToObject", ex);
            }
        }
        internal SurrogateTypeDescriber(ITypeDescriber typeDescriber, ITypeDescriber fallback, SurrogateTypeDescriberFallbackBehavior fallbackBehavior, ImmutableDictionary <TypeInfo, TypeInfo> surrogateTypes)
        {
            SurrogateTypes    = surrogateTypes;
            TypeDescriber     = typeDescriber;
            FallbackDescriber = fallback;

            switch (fallbackBehavior)
            {
            case SurrogateTypeDescriberFallbackBehavior.Throw:
                ThrowOnNoRegisteredSurrogate = true;
                break;

            case SurrogateTypeDescriberFallbackBehavior.UseFallback:
                ThrowOnNoRegisteredSurrogate = false;
                break;

            default:
                Throw.ImpossibleException($"Unexpected {nameof(SurrogateTypeDescriberFallbackBehavior)}: {fallbackBehavior}");
                break;
            }
        }
Beispiel #20
0
 public TypeIdentifier(Type type, int id)
 {
     if (TypeIdentifier._IsEnum(type))
     {
         Describer = new EnumDescriber(id, type);
     }
     else if (TypeIdentifier._IsNumber(type))
     {
         Describer = new NumberDescriber(id, type);
     }
     else if (TypeIdentifier._IsByteArray(type))
     {
         Describer = new ByteArrayDescriber(id);
     }
     else if (TypeIdentifier._IsBuffer(type))
     {
         Describer = new BufferDescriber(id, type);
     }
     else if (TypeIdentifier._IsBittable(type))
     {
         Describer = new BlittableDescriber(id, type);
     }
     else if (TypeIdentifier._IsString(type))
     {
         Describer = new StringDescriber(id);
     }
     else if (_IsArray(type))
     {
         Describer = new ArrayDescriber(id, type);
     }
     else if (TypeIdentifier._IsClass(type))
     {
         Describer = new ClassDescriber(id, type);
     }
     else
     {
         throw new Exception("Unrecognized type " + type.FullName);
     }
 }
Beispiel #21
0
        int ITypeDescriber.ToObject(byte[] buffer, int begin, out object instnace)
        {
            try
            {
                int   offset = begin;
                ulong count;
                offset += Varint.BufferToNumber(buffer, offset, out count);
                IList array = Activator.CreateInstance(_Type, (int)count) as IList;
                instnace = array;

                ulong validCount;
                offset += Varint.BufferToNumber(buffer, offset, out validCount);


                for (ulong i = 0UL; i < validCount; i++)
                {
                    ulong index = 0LU;

                    offset += Varint.BufferToNumber(buffer, offset, out index);

                    Type objType;
                    offset += _TypeSet.Get().ToObject(buffer, offset, out objType);
                    ITypeDescriber describer = _TypeSet.Get(objType);
                    object         value;
                    offset += describer.ToObject(buffer, offset, out value);


                    array[(int)index] = value;
                }

                return(offset - begin);
            }
            catch (Exception ex)
            {
                throw new DescriberException(typeof(ArrayDescriber), _Type, "ToObject", ex);;
            }
        }
Beispiel #22
0
        int ITypeDescriber.ToBuffer(object instance, byte[] buffer, int begin)
        {
            try
            {
                int offset      = begin;
                var validFields = _Fields.Select(
                    (field, index) => new
                {
                    field,
                    index
                }).Where(validField => object.Equals(_GetDescriber(validField.field).Default, validField.field.GetValue(instance)) == false)
                                  .ToArray();

                offset += Varint.NumberToBuffer(buffer, offset, validFields.Length);


                foreach (var validField in validFields)
                {
                    int index = validField.index;
                    offset += Varint.NumberToBuffer(buffer, offset, index);
                    FieldInfo field     = validField.field;
                    object    value     = field.GetValue(instance);
                    Type      valueType = value.GetType();
                    offset += _TypeSet.Get().ToBuffer(valueType, buffer, offset);
                    ITypeDescriber describer = _TypeSet.Get(valueType);
                    offset += describer.ToBuffer(value, buffer, offset);
                }


                return(offset - begin);
            }
            catch (Exception ex)
            {
                throw new DescriberException(typeof(ClassDescriber), _Type, "ToBuffer", ex);
            }
        }
 /// <summary>
 /// Creates a SurrogateTypeDescriberBuilder with the given fallback behavior and type describer.
 ///
 /// Uses the given ITypeDescriber to describes surrogates,
 ///   and falls back to TypeDescriber.Default if no surrogate is registered if the provided SurrogateTypeDescriberFallbackBehavior
 ///   allows it.
 /// </summary>
 public static SurrogateTypeDescriberBuilder CreateBuilder(SurrogateTypeDescriberFallbackBehavior fallbackBehavior, ITypeDescriber typeDescriber)
 => CreateBuilder(fallbackBehavior, typeDescriber, TypeDescribers.Default);
        /// <summary>
        /// Creates a SurrogateTypeDescriberBuilder with the given fallback behavior, type describer, and fallback type describer.
        ///
        /// Uses the given ITypeDescriber to describes surrogates,
        ///   and falls back to provided fallback if no surrogate is registered and the provided SurrogateTypeDescriberFallbackBehavior
        ///   allows it.
        /// </summary>
        public static SurrogateTypeDescriberBuilder CreateBuilder(SurrogateTypeDescriberFallbackBehavior fallbackBehavior, ITypeDescriber typeDescriber, ITypeDescriber fallbackTypeDescriber)
        {
            if (!Enum.IsDefined(Types.SurrogateTypeDescriberFallbackBehavior, fallbackBehavior))
            {
                Throw.ArgumentException($"Unexpected {nameof(SurrogateTypeDescriberFallbackBehavior)}: {fallbackBehavior}", nameof(fallbackBehavior));
            }

            Utils.CheckArgumentNull(typeDescriber, nameof(typeDescriber));
            Utils.CheckArgumentNull(fallbackTypeDescriber, nameof(fallbackTypeDescriber));

            var inner = ImmutableDictionary.CreateBuilder <TypeInfo, TypeInfo>();

            return(new SurrogateTypeDescriberBuilder(typeDescriber, fallbackTypeDescriber, fallbackBehavior, inner));
        }
Beispiel #25
0
        /// <summary>
        /// Create a new empty ManualTypeDescriberBuilder with the given fallback behavior.
        /// </summary>
        public static ManualTypeDescriberBuilder CreateBuilder(ManualTypeDescriberFallbackBehavior fallbackBehavior, ITypeDescriber fallbackTypeDescriber)
        {
            if (!Enum.IsDefined(Types.ManualTypeDescriberFallbackBehavior, fallbackBehavior))
            {
                Throw.ArgumentException($"Unexpected value: {fallbackBehavior}", nameof(fallbackBehavior));
            }

            Utils.CheckArgumentNull(fallbackTypeDescriber, nameof(fallbackTypeDescriber));

            return(new ManualTypeDescriberBuilder(fallbackBehavior, fallbackTypeDescriber));
        }
Beispiel #26
0
        void ITypeDescriber.SetMap(TypeSet type_set)
        {
            var type = type_set.GetByType(typeof(int));

            _IntTypeDescriber = type;
        }
Beispiel #27
0
 public ByteArrayDescriber(ITypeDescriber byte_describer)
 {
     _IntTypeDescriber = byte_describer;
 }
Beispiel #28
0
 public StringDescriber(ITypeDescriber chars_describer)
 {
     _CharArrayDescriber = chars_describer;
 }
Beispiel #29
0
 public StringKeyDescriber(ITypeFinder type_finder, IDescribersFinder describers_finder)
 {
     _TypeFinder    = type_finder;
     _TypeDescriber = describers_finder.Get(typeof(string));
 }
Beispiel #30
0
 void ITypeDescriber.SetMap(TypeSet type_set)
 {
     _CharArrayDescriber = type_set.GetByType(typeof(char[]));
 }