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); } }
public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, Version value) { if (value == null) { writer.WriteNull(); return; } writer.Write(value.ToString()); }
public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, BssomBoolean value) { if (value == null) { writer.WriteNull(); return; } writer.Write(value.GetBoolean()); }
public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, BssomDateTime value) { if (value == null) { writer.WriteNull(); return; } writer.Write(value.GetDateTime(), context.Option.IsUseStandardDateTime); }
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; } }
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; } }
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); }
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; } }
//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); } }
//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))); }
//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))); } }
public void Serialize(ref BssomWriter writer, ref BssomSerializeContext context, BssomNull value) { writer.WriteNull(); }