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); }
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(); }