示例#1
0
        public static void WriteEnumerable <T>(this UnsafeWriter writer, CtxWriteDelegate <T> itemWriter, SerializationCtx ctx, IEnumerable <T> value)
        {
            if (value == null)
            {
                writer.Write(-1);
                return;
            }

            var cookie = new UnsafeWriter.Bookmark(writer);

            writer.Write(-1); // length
            int i = 0;

            foreach (var item in value)
            {
                ++i;
                itemWriter(ctx, writer, item);
            }

            cookie.WriteIntLength(i);
        }
示例#2
0
        public void Write <T>(SerializationCtx ctx, UnsafeWriter writer, T value)
        {
            bool TryGetTypeMapping(Type type1, out RdId rdId)
            {
                lock (myLock)
                    return(myTypeMapping.TryGetValue(type1, out rdId));
            }

#if !NET35
            myBackgroundRegistrar.WaitForEmpty();
#endif

            if (value == null)
            {
                // ReSharper disable once ImpureMethodCallOnReadonlyValueField
                RdId.Nil.Write(writer);
                return;
            }

            var type = value.GetType();
            if (!TryGetTypeMapping(type, out var typeId))
            {
                myRegistrar?.TryRegister(type, this);
                if (!TryGetTypeMapping(type, out typeId))
                {
                    throw new KeyNotFoundException($"Type {type.FullName} have not registered");
                }
            }
            typeId.Write(writer);

            // Don't dispose this cookie, otherwise it will delete all written data
            var bookmark = new UnsafeWriter.Bookmark(writer);
            writer.Write(0);
            CtxWriteDelegate <object> writerDelegate;
            lock (myLock)
                writerDelegate = myWriters[typeId];
            writerDelegate(ctx, writer, value);

            bookmark.WriteIntLength();
        }