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);
            }
        }
Exemple #3
0
        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)));
            }
        }