public static long WriteMapHead(ref BssomWriter writer, int valueCount, int maxDepth) { DEBUG.Assert(valueCount != 0 && maxDepth != 0); writer.FillUInt32FixNumber(); //len writer.WriteVariableNumber(valueCount); //count writer.WriteVariableNumber(maxDepth); //depth long routeLenPos = writer.Position; writer.FillUInt32FixNumber();//routelen return(routeLenPos); }
//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); } }
private unsafe int WriteKey(byte lastValueByteCount, byte keyType, bool keyIsNativeType, ulong keyBytes) { WriteKeyBytes(lastValueByteCount, keyBytes); if (keyIsNativeType) { writer.WriteNativeType(keyType); } else { writer.WriteBuildInType(keyType); } int valueOffset = GetRelativePosition(); writer.FillUInt32FixNumber(); return(valueOffset); }
//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))); } }