private static unsafe void WrongSerialize(SpacingValuesClass value)
        {
            BssomSerializeContext context = new BssomSerializeContext(BssomSerializerOptions.IntKeyCompositedResolverOption, default);

            using (ExpandableBufferWriter buffer = ExpandableBufferWriter.CreateGlobar())
            {
                BssomWriter writer = new BssomWriter(buffer);
                if (value == null)
                {
                    writer.WriteNull();
                    return;
                }
                long num = writer.WriteArray3Header(6);
                uint num2 = 0, num3 = 0, num4 = 0, num5 = 0, num6 = 0, num7 = 0;

                num2 = (uint)(writer.Position - num);
                writer.Write(value.A);
                num3 = (uint)(writer.Position - num);
                writer.WriteNull();
                num4 = (uint)(writer.Position - num);
                writer.WriteNull();
                num5 = (uint)(writer.Position - num);
                writer.Write(value.B);
                num6 = (uint)(writer.Position - num);
                writer.WriteNull();
                num7 = (uint)(writer.Position - num);
                writer.Write(value.C);

                //writer.WriteBackArray3Header(num, ref num2, 6);
            }
        }
예제 #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, BssomBoolean value)
 {
     if (value == null)
     {
         writer.WriteNull();
         return;
     }
     writer.Write(value.GetBoolean());
 }
예제 #4
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);
 }
예제 #5
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;
            }
        }
예제 #6
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;
            }
        }
예제 #7
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);
        }
예제 #8
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;
            }
        }
예제 #9
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);
            }
        }
예제 #10
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)));
        }
예제 #11
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)));
            }
        }
예제 #12
0
 public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, BssomNull value)
 {
     writer.WriteNull();
 }