Пример #1
0
 public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, BssomBoolean value)
 {
     if (value == null)
     {
         writer.WriteNull();
         return;
     }
     writer.Write(value.GetBoolean());
 }
Пример #2
0
 public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, Version value)
 {
     if (value == null)
     {
         writer.WriteNull();
         return;
     }
     writer.Write(value.ToString());
 }
Пример #3
0
 public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, BssomDateTime value)
 {
     if (value == null)
     {
         writer.WriteNull();
         return;
     }
     writer.Write(value.GetDateTime(), context.Option.IsUseStandardDateTime);
 }
Пример #4
0
        public void SerializeTestWithContext()
        {
            int val     = int.MaxValue;
            var context = new BssomSerializeContext();
            var buf     = BssomSerializer.Serialize(ref context, val);

            buf.Length.Is(5);
            BssomSerializer.Deserialize <int>(buf, 0, out int readSize).Is(int.MaxValue);
            readSize.Is(5);
        }
Пример #5
0
        public void SerializeTestWithContext_Stream()
        {
            int val     = int.MaxValue;
            var context = new BssomSerializeContext();
            var stream  = new FakePipeStream();

            BssomSerializer.Serialize(ref context, val, stream);
            stream.CurrentCursor().Is(5);
            BssomSerializer.Deserialize <int>(stream.ToArray(), 0, out int readSize).Is(int.MaxValue);
            readSize.Is(5);
        }
Пример #6
0
        public void SerializeTestWithRefBytes_Context()
        {
            BssomSerializeContext context = new BssomSerializeContext();
            int val = int.MaxValue;

            byte[] buf = new byte[8];
            buf[1] = 3;
            BssomSerializer.Serialize(ref context, ref buf, 2, val).Is(5);
            buf.Length.Is(8);
            buf[1].Is(3);
            BssomSerializer.Deserialize <int>(buf, 2, out int readSize).Is(int.MaxValue);
            readSize.Is(5);
        }
Пример #7
0
        public void SerializeTestWithContext_IBssomBufferWriter()
        {
            int val     = int.MaxValue;
            var context = new BssomSerializeContext();
            var bufw    = ExpandableBufferWriter.CreateGlobar();

            BssomSerializer.Serialize(ref context, val, bufw);
            var buf = bufw.GetBufferedArray();

            buf.Length.Is(5);
            BssomSerializer.Deserialize <int>(buf, 0, out int readSize).Is(int.MaxValue);
            readSize.Is(5);
        }
Пример #8
0
        public static void Serialize <TKey, TValue>(ref BssomWriter writer, ref BssomSerializeContext context, IEnumerable <KeyValuePair <TKey, TValue> > value, int count)
        {
            if (typeof(TKey) == typeof(DateTime))
            {
                context.Option = context.Option.WithIsUseStandardDateTime(false);
            }

            if (context.Option.IDictionaryIsSerializeMap1Type)
            {
                MapFormatterHelper_Map1.Serialize(ref writer, value, ref context, count);
            }
            else
            {
                MapFormatterHelper_Map2.Serialize(ref writer, value, ref context, count);
            }
        }
Пример #9
0
        public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, BssomValue value)
        {
            if (value == null)
            {
                writer.WriteNull();
                return;
            }
            switch (value.ValueType)
            {
            case BssomValueType.Array:
                BssomArrayFormatter.Instance.Serialize(ref writer, ref context, (BssomArray)value);
                break;

            case BssomValueType.Map:
                BssomMapFormatter.Instance.Serialize(ref writer, ref context, (BssomMap)value);
                break;

            case BssomValueType.Null:
                BssomNullFormatter.Instance.Serialize(ref writer, ref context, (BssomNull)(value));
                break;

            case BssomValueType.Number:
                BssomNumberFormatter.Instance.Serialize(ref writer, ref context, (BssomNumber)value);
                break;

            case BssomValueType.Float:
                BssomFloatFormatter.Instance.Serialize(ref writer, ref context, (BssomFloat)(value));
                break;

            case BssomValueType.String:
                BssomStringFormatter.Instance.Serialize(ref writer, ref context, (BssomString)(value));
                break;

            case BssomValueType.DateTime:
                BssomDateTimeFormatter.Instance.Serialize(ref writer, ref context, (BssomDateTime)(value));
                break;

            case BssomValueType.Char:
                BssomCharFormatter.Instance.Serialize(ref writer, ref context, (BssomChar)value);
                break;

            default:    //case BssomValueType.Boolean:
                BssomBooleanFormatter.Instance.Serialize(ref writer, ref context, (BssomBoolean)(value));
                break;
            }
        }
Пример #10
0
        public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, BssomFloat value)
        {
            if (value == null)
            {
                writer.WriteNull();
                return;
            }
            switch (value.FloatType)
            {
            case BssomFloat.BssomFloatType.Single:
                writer.Write(value.GetFloat32());
                break;

            default:    //case BssomFloatType.Double:
                writer.Write(value.GetFloat64());
                break;
            }
        }
Пример #11
0
        public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, object value)
        {
            if (value == null)
            {
                writer.WriteNull();
                return;
            }

            Type realType = value.GetType();

            if (realType == typeof(object))
            {
                writer.WriteArray1BuildInType(BssomType.Map2);
                BssMapObjMarshal.WriteEmptyMapObject(ref writer);
                return;
            }

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

            if (!SerializerDelegates.TryGetValue(realType, out SerializeMethod serializerDelegate))
            {
                Type formatterType         = typeof(IBssomFormatter <>).MakeGenericType(realType);
                ParameterExpression param0 = Expression.Parameter(typeof(object), "formatter");
                ParameterExpression param1 = Expression.Parameter(typeof(BssomWriter).MakeByRefType(), "writer");
                ParameterExpression param2 = Expression.Parameter(typeof(BssomSerializeContext).MakeByRefType(), "context");
                ParameterExpression param3 = Expression.Parameter(typeof(object), "value");

                MethodInfo serializeMethod = formatterType.GetRuntimeMethod(nameof(Serialize), new[] { typeof(BssomWriter).MakeByRefType(), typeof(BssomSerializeContext).MakeByRefType(), realType });

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

                serializerDelegate = Expression.Lambda <SerializeMethod>(body, param0, param1, param2, param3).Compile();
                SerializerDelegates.TryAdd(realType, serializerDelegate);
            }

            serializerDelegate(formatter, ref writer, ref context, value);
        }
Пример #12
0
        public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, BssomNumber value)
        {
            if (value == null)
            {
                writer.WriteNull();
                return;
            }
            switch (value.NumberType)
            {
            case BssomNumber.BssomNumberType.SByte:
                writer.Write(value.GetSByte());
                break;

            case BssomNumber.BssomNumberType.Byte:
                writer.Write(value.GetByte());
                break;

            case BssomNumber.BssomNumberType.Short:
                writer.Write(value.GetShort());
                break;

            case BssomNumber.BssomNumberType.Int:
                writer.Write(value.GetInt());
                break;

            case BssomNumber.BssomNumberType.Long:
                writer.Write(value.GetLong());
                break;

            case BssomNumber.BssomNumberType.UShort:
                writer.Write(value.GetUShort());
                break;

            case BssomNumber.BssomNumberType.UInt:
                writer.Write(value.GetUInt());
                break;

            default:    //case BssomNumberType.ULong:
                writer.Write(value.GetULong());
                break;
            }
        }
Пример #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);
        }
Пример #14
0
        //Serialize IEnumerable<>
        public static void SerializeGenericIEnumerable <TElement>(ref BssomWriter writer,
                                                                  ref BssomSerializeContext context, IEnumerable <TElement> value)
        {
            if (value == null)
            {
                writer.WriteNull();
                return;
            }

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

            writer.WriteArray2Type();
            long pos = writer.FillUInt32FixNumber();

            if (value.TryGetICollectionCount(out int count))
            {
                writer.WriteVariableNumber(count);
                foreach (TElement item in value)
                {
                    context.CancellationToken.ThrowIfCancellationRequested();
                    formatter.Serialize(ref writer, ref context, item);
                }
                writer.WriteBackFixNumber(pos, checked ((int)(writer.Position - pos - BssomBinaryPrimitives.FixUInt32NumberSize)));
            }
            else
            {
                count = 0;
                long posCount = writer.FillUInt32FixNumber();
                foreach (TElement item in value)
                {
                    context.CancellationToken.ThrowIfCancellationRequested();
                    count++;
                    formatter.Serialize(ref writer, ref context, item);
                }
                long cPos = writer.Position;
                writer.BufferWriter.Seek(pos);
                writer.WriteBackFixNumber(checked ((int)(writer.Position - posCount)));
                writer.WriteBackFixNumber(count);
                writer.BufferWriter.Seek(cPos);
            }
        }
Пример #15
0
        //Serialize IList
        public static void SerializeIList(ref BssomWriter writer, ref BssomSerializeContext context, IList value)
        {
            if (value == null)
            {
                writer.WriteNull();
                return;
            }

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

            writer.WriteArray2Type();
            long pos = writer.FillUInt32FixNumber();

            writer.WriteVariableNumber(value.Count);
            for (int i = 0; i < value.Count; i++)
            {
                context.CancellationToken.ThrowIfCancellationRequested();
                formatter.Serialize(ref writer, ref context, value[i]);
            }
            writer.WriteBackFixNumber(pos, checked ((int)(writer.Position - pos - BssomBinaryPrimitives.FixUInt32NumberSize)));
        }
Пример #16
0
        //Serialize IList<> / IReadOnlyList<>
        public static void SerializeGenerIList <TElement>(ref BssomWriter writer, ref BssomSerializeContext context,
                                                          IEnumerable <TElement> value)
        {
            if (value == null)
            {
                writer.WriteNull();
            }
            else
            {
                DEBUG.Assert(value is IList <TElement> || value is IReadOnlyList <TElement>);
                IBssomFormatter <TElement> formatter = context.Option.FormatterResolver.GetFormatterWithVerify <TElement>();

                writer.WriteArray2Type();
                long pos = writer.FillUInt32FixNumber();
                if (value is IList <TElement> list)
                {
                    writer.WriteVariableNumber(list.Count);
                    for (int i = 0; i < list.Count; i++)
                    {
                        context.CancellationToken.ThrowIfCancellationRequested();
                        formatter.Serialize(ref writer, ref context, list[i]);
                    }
                }
                else
                {
                    IReadOnlyList <TElement> rels = Unsafe.As <IEnumerable <TElement>, IReadOnlyList <TElement> >(ref value);
                    writer.WriteVariableNumber(rels.Count);
                    for (int i = 0; i < rels.Count; i++)
                    {
                        context.CancellationToken.ThrowIfCancellationRequested();
                        formatter.Serialize(ref writer, ref context, rels[i]);
                    }
                }
                writer.WriteBackFixNumber(pos, checked ((int)(writer.Position - pos - BssomBinaryPrimitives.FixUInt32NumberSize)));
            }
        }
Пример #17
0
 public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, T value)
 {
     serializer(ref writer, ref context, value);
 }
 public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, Int32 value)
 {
     writer.Write(value);
 }
Пример #19
0
 public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, IDictionary value)
 {
     MapFormatterHelper.SerializeIDictionary(ref writer, ref context, value);
 }
Пример #20
0
 public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, BssomArray value)
 {
     ObjectFormatter.Instance.Serialize(ref writer, ref context, value.RawValue);
 }
Пример #21
0
 public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, int value)
 {
     value -= 5;
     PrimitiveResolver.Instance.GetFormatter <int>().Serialize(ref writer, ref context, value);
 }
Пример #22
0
 public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, BssomMap value)
 {
     MapFormatterHelper.SerializeGenericDictionary(ref writer, ref context, value.GetMap());
 }
Пример #23
0
 public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, BssomNull value)
 {
     writer.WriteNull();
 }
Пример #24
0
            public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, _Attribute_Class_3 value)
            {
                SecurityVerification(value, context.Option);

                MapCodeGenResolver.Instance.GetFormatter <_Attribute_Class_3>().Serialize(ref writer, ref context, value);
            }
Пример #25
0
 public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, DateTime value)
 {
     writer.Write(value, context.Option.IsUseStandardDateTime);
 }