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); }
static BssMapObjMarshal() { ExpandableBufferWriter bw = ExpandableBufferWriter.CreateTemporary(); BssomWriter cw = new BssomWriter(bw); cw.WriteUInt32FixNumber(7);//reference DefaultMapLengthFieldSize cw.WriteVariableNumber(0); cw.WriteVariableNumber(0); cw.WriteUInt32FixNumber(0);//reference DefaultRouteLengthFieldSize Empty = bw.GetBufferedArray(); }
static Array3Cache() { ExpandableBufferWriter bw = ExpandableBufferWriter.CreateTemporary(); BssomWriter cw = new BssomWriter(bw); cw.WriteBuildInType(BssomType.Array3); cw.WriteVariableNumber(BssomBinaryPrimitives.FixUInt32NumberSize); //len cw.WriteUInt32FixNumber(0); //count Empty = bw.GetBufferedArray(); }
//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))); } }
//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))); }