public bool TrySerialize(TEnum element, Span <byte> output, out int actualSize) { return(serializer.TrySerialize( toFunc(element), output, out actualSize)); }
public override DatabaseBuilder AddArray <T, TKey>( IConstSizeSerializer <T> serializer, Func <Database, IEnumerable <T> > elements, Func <T, TKey> selector, IComparer <TKey>?comparer) { try { var headerPosition = stream.Position; // write a dummy header var dummyHeaderBytes = new ArrayHeader(serializer).AsBytes(); stream.Write(dummyHeaderBytes); var elementLength = serializer.ElementSize; Utility.EnsureArrayOfMinimalSize(ref buffer, elementLength); long elementCount = 0; var elementsEnumerable = elements(db); if (comparer != null) { elementsEnumerable = elementsEnumerable.OrderBy(selector, comparer); } foreach (var element in elementsEnumerable) { serializer.TrySerialize(element, buffer.AsSpan(), out _); stream.Write(buffer, 0, elementLength); elementCount++; } var pastEndPosition = stream.Position; stream.Seek(headerPosition, SeekOrigin.Begin); var arrayHeader = new ArrayHeader(serializer) { OverallLength = elementLength * elementCount, RecordCount = elementCount, StartsAt = headerPosition + dummyHeaderBytes.Length, EndsAt = pastEndPosition, Type = 1 }; stream.Write(arrayHeader.AsBytes()); stream.Seek(pastEndPosition, SeekOrigin.Begin); headers.Add(arrayHeader); } catch { stream.Dispose(); db.Dispose(); throw; } return(this); }