//Size IEnumerable
        public static int SizeIEnumerable(ref BssomSizeContext context, IEnumerable value)
        {
            if (value == null)
            {
                return(BssomBinaryPrimitives.NullSize);
            }

            IBssomFormatter <object> formatter = context.Option.FormatterResolver.GetFormatterWithVerify <object>();

            long dataLen = 0;

            foreach (object item in value)
            {
                dataLen += formatter.Size(ref context, item);
            }

            if (value is ICollection coll)
            {
                return(BssomBinaryPrimitives.Array2TypeSize(coll.Count, dataLen));
            }
            else
            {
                return(BssomBinaryPrimitives.Array2TypeSizeWithFixU32Count(dataLen));
            }
        }
Esempio n. 2
0
        public int Size(ref BssomSizeContext context, BssomNumber value)
        {
            if (value == null)
            {
                return(BssomBinaryPrimitives.NullSize);
            }

            switch (value.NumberType)
            {
            case BssomNumber.BssomNumberType.SByte:
                return(BssomBinaryPrimitives.BuildInTypeCodeSize + BssomBinaryPrimitives.Int8Size);

            case BssomNumber.BssomNumberType.Byte:
                return(BssomBinaryPrimitives.BuildInTypeCodeSize + BssomBinaryPrimitives.UInt8Size);

            case BssomNumber.BssomNumberType.Short:
                return(BssomBinaryPrimitives.BuildInTypeCodeSize + BssomBinaryPrimitives.Int16Size);

            case BssomNumber.BssomNumberType.Int:
                return(BssomBinaryPrimitives.BuildInTypeCodeSize + BssomBinaryPrimitives.Int32Size);

            case BssomNumber.BssomNumberType.Long:
                return(BssomBinaryPrimitives.BuildInTypeCodeSize + BssomBinaryPrimitives.Int64Size);

            case BssomNumber.BssomNumberType.UShort:
                return(BssomBinaryPrimitives.BuildInTypeCodeSize + BssomBinaryPrimitives.UInt16Size);

            case BssomNumber.BssomNumberType.UInt:
                return(BssomBinaryPrimitives.BuildInTypeCodeSize + BssomBinaryPrimitives.UInt32Size);

            default:    //case BssomNumberType.ULong:
                return(BssomBinaryPrimitives.BuildInTypeCodeSize + BssomBinaryPrimitives.UInt64Size);
            }
        }
Esempio n. 3
0
        public void SizeTestWithContext()
        {
            int val = int.MaxValue;
            BssomSizeContext context = new BssomSizeContext();

            BssomSerializer.Size(ref context, val).Is(5);
        }
Esempio n. 4
0
        public int Size(ref BssomSizeContext context, BssomBoolean value)
        {
            if (value == null)
            {
                return(BssomBinaryPrimitives.NullSize);
            }

            return(BssomBinaryPrimitives.BuildInTypeCodeSize + BssomBinaryPrimitives.BooleanSize);
        }
Esempio n. 5
0
        public int Size(ref BssomSizeContext context, BssomChar value)
        {
            if (value == null)
            {
                return(BssomBinaryPrimitives.NullSize);
            }

            return(BssomBinaryPrimitives.NativeTypeCodeSize + BssomBinaryPrimitives.CharSize);
        }
Esempio n. 6
0
        public int Size(ref BssomSizeContext context, string value)
        {
            if (value == null)
            {
                return(BssomBinaryPrimitives.NullSize);
            }

            return(BssomBinaryPrimitives.StringSize(value) + BssomBinaryPrimitives.BuildInTypeCodeSize);
        }
        public int Size(ref BssomSizeContext context, ArraySegment <SByte> value)
        {
            if (value.Array == null)
            {
                return(BssomBinaryPrimitives.NullSize);
            }

            return(BssomBinaryPrimitives.Array1BuildInTypeSize(BssomBinaryPrimitives.Int8Size, value.Count));
        }
Esempio n. 8
0
        public int Size(ref BssomSizeContext context, SByte[] value)
        {
            if (value == null)
            {
                return(BssomBinaryPrimitives.NullSize);
            }

            return(BssomBinaryPrimitives.Array1BuildInTypeSize(BssomBinaryPrimitives.Int8Size, value.Length));
        }
Esempio n. 9
0
        public int Size(ref BssomSizeContext context, SByte?value)
        {
            if (value == null)
            {
                return(BssomBinaryPrimitives.NullSize);
            }

            return(BssomBinaryPrimitives.Int8Size + BssomBinaryPrimitives.BuildInTypeCodeSize);
        }
Esempio n. 10
0
        public int Size(ref BssomSizeContext context, BssomDateTime value)
        {
            if (value == null)
            {
                return(BssomBinaryPrimitives.NullSize);
            }

            if (context.Option.IsUseStandardDateTime)
            {
                return(BssomBinaryPrimitives.BuildInTypeCodeSize + BssomBinaryPrimitives.StandardDateTimeSize);
            }

            return(BssomBinaryPrimitives.NativeTypeCodeSize + BssomBinaryPrimitives.NativeDateTimeSize);
        }
Esempio n. 11
0
        public int Size(ref BssomSizeContext context, BssomFloat value)
        {
            if (value == null)
            {
                return(BssomBinaryPrimitives.NullSize);
            }

            switch (value.FloatType)
            {
            case BssomFloat.BssomFloatType.Single:
                return(BssomBinaryPrimitives.BuildInTypeCodeSize + BssomBinaryPrimitives.Float32Size);

            default:    //case BssomFloatType.Double:
                return(BssomBinaryPrimitives.BuildInTypeCodeSize + BssomBinaryPrimitives.Float64Size);
            }
        }
Esempio n. 12
0
        public static int Size <TKey, TValue>(ref BssomSizeContext context, IEnumerable <KeyValuePair <TKey, TValue> > value, int count)
        {
            if (typeof(TKey) == typeof(DateTime))
            {
                context.Option = context.Option.WithIsUseStandardDateTime(false);
            }

            if (context.Option.IDictionaryIsSerializeMap1Type)
            {
                return(MapFormatterHelper_Map1.Size(ref context, value, count));
            }
            else
            {
                return(MapFormatterHelper_Map2.Size(ref context, value, count));
            }
        }
Esempio n. 13
0
        public void MyTest()
        {
            var              option      = BssomSerializerOptions.Default.WithFormatterResolver(MyStringFormatterResolver.Instance);
            string           str         = RandomHelper.RandomValue <string>();
            BssomSizeContext sizeContext = new BssomSizeContext(option);
            int              len         = BssomSerializer.Size(ref sizeContext, str);

            if (len > 1000)
            {
                throw new Exception("Size of value storage binary exceeded");
            }

            BssomSerializeContext serContext = new BssomSerializeContext(option);

            sizeContext.ContextDataSlots.SetMyStringStack(serContext.ContextDataSlots);
            var bytes = BssomSerializer.Serialize(ref serContext, str);
            var deStr = BssomSerializer.Deserialize <string>(bytes);

            Assert.Equal(str, deStr);
        }
Esempio n. 14
0
        public int Size(ref BssomSizeContext context, object value)
        {
            if (value == null)
            {
                return(BssomBinaryPrimitives.NullSize);
            }

            Type realType = value.GetType();

            if (realType == typeof(object))
            {
                return(BssMapObjMarshal.Empty.Length + BssomBinaryPrimitives.BuildInTypeCodeSize);
            }

            object formatter = context.Option.FormatterResolver.GetFormatterWithVerify(realType);

            if (!SizeDelegates.TryGetValue(realType, out SizeMethod sizeDelegate))
            {
                Type formatterType         = typeof(IBssomFormatter <>).MakeGenericType(realType);
                ParameterExpression param0 = Expression.Parameter(typeof(object), "formatter");
                ParameterExpression param1 = Expression.Parameter(typeof(BssomSizeContext).MakeByRefType(), "context");
                ParameterExpression param2 = Expression.Parameter(typeof(object), "value");

                MethodInfo sizeMethod = formatterType.GetRuntimeMethod(nameof(Size), new[] { typeof(BssomSizeContext).MakeByRefType(), realType });

                MethodCallExpression body = Expression.Call(
                    Expression.Convert(param0, formatterType),
                    sizeMethod, param1,
                    realType.IsValueType ? Expression.Unbox(param2, realType) : Expression.Convert(param2, realType)
                    );

                sizeDelegate = Expression.Lambda <SizeMethod>(body, param0, param1, param2).Compile();
                SizeDelegates.TryAdd(realType, sizeDelegate);
            }

            return(sizeDelegate(formatter, ref context, value));
        }
Esempio n. 15
0
        //Size IEnumerable<>
        public static int SizeGenericIEnumerable <TElement>(ref BssomSizeContext context, IEnumerable <TElement> value)
        {
            if (value == null)
            {
                return(BssomBinaryPrimitives.NullSize);
            }

            IBssomFormatter <TElement> formatter = context.Option.FormatterResolver.GetFormatterWithVerify <TElement>();
            long dataLen = 0;

            foreach (TElement item in value)
            {
                dataLen += formatter.Size(ref context, item);
            }

            if (value.TryGetICollectionCount(out int count))
            {
                return(BssomBinaryPrimitives.Array2TypeSize(count, dataLen));
            }
            else
            {
                return(BssomBinaryPrimitives.Array2TypeSizeWithFixU32Count(dataLen));
            }
        }
Esempio n. 16
0
        public int Size(ref BssomSizeContext context, BssomValue value)
        {
            if (value == null)
            {
                return(BssomBinaryPrimitives.NullSize);
            }
            switch (value.ValueType)
            {
            case BssomValueType.Array:
                return(BssomArrayFormatter.Instance.Size(ref context, (BssomArray)value));

            case BssomValueType.Map:
                return(BssomMapFormatter.Instance.Size(ref context, (BssomMap)value));

            case BssomValueType.Null:
                return(BssomNullFormatter.Instance.Size(ref context, (BssomNull)(value)));

            case BssomValueType.Number:
                return(BssomNumberFormatter.Instance.Size(ref context, (BssomNumber)value));

            case BssomValueType.String:
                return(BssomStringFormatter.Instance.Size(ref context, (BssomString)(value)));

            case BssomValueType.Char:
                return(BssomCharFormatter.Instance.Size(ref context, (BssomChar)(value)));

            case BssomValueType.Guid:
                return(BssomGuidFormatter.Instance.Size(ref context, (BssomGuid)(value)));

            case BssomValueType.Boolean:
                return(BssomBooleanFormatter.Instance.Size(ref context, (BssomBoolean)(value)));

            default:    //case BssomValueType.DateTime:
                return(BssomDateTimeFormatter.Instance.Size(ref context, (BssomDateTime)(value)));
            }
        }
Esempio n. 17
0
 public int Size(ref BssomSizeContext context, T value)
 {
     return(size + BssomBinaryPrimitives.BuildInTypeCodeSize);
 }
 public int Size(ref BssomSizeContext context, Guid value)
 {
     return(BssomBinaryPrimitives.GuidSize + BssomBinaryPrimitives.NativeTypeCodeSize);
 }
 public int Size(ref BssomSizeContext context, Decimal value)
 {
     return(BssomBinaryPrimitives.DecimalSize + BssomBinaryPrimitives.NativeTypeCodeSize);
 }
Esempio n. 20
0
 public int Size(ref BssomSizeContext context, BssomMap value)
 {
     return(MapFormatterHelper.SizeGenericDictionary(ref context, value.GetMap()));
 }
Esempio n. 21
0
 public int Size(ref BssomSizeContext context, IDictionary value)
 {
     return(MapFormatterHelper.SizeIDictionary(ref context, value));
 }
Esempio n. 22
0
 public int Size(ref BssomSizeContext context, BssomArray value)
 {
     return(ObjectFormatter.Instance.Size(ref context, value.RawValue));
 }
Esempio n. 23
0
 public int Size(ref BssomSizeContext context, DateTime value)
 {
     return(BssomBinaryPrimitives.DateTimeSize(context.Option.IsUseStandardDateTime));
 }
Esempio n. 24
0
 public int Size(ref BssomSizeContext context, int value)
 {
     return(PrimitiveResolver.Instance.GetFormatter <int>().Size(ref context, value));
 }
 public int Size(ref BssomSizeContext context, Double value)
 {
     return(BssomBinaryPrimitives.Float64Size + BssomBinaryPrimitives.BuildInTypeCodeSize);
 }
Esempio n. 26
0
            public int Size(ref BssomSizeContext context, _Attribute_Class_3 value)
            {
                SecurityVerification(value, context.Option);

                return(MapCodeGenResolver.Instance.GetFormatter <_Attribute_Class_3>().Size(ref context, value));
            }
Esempio n. 27
0
 public int Size(ref BssomSizeContext context, BssomNull value)
 {
     return(BssomBinaryPrimitives.NullSize);
 }