protected override string DetermineNextTypeName(Configuration configuration, BinaryContext context)
        {
            CreateTypeReaderFactory(configuration,context);
            long markerSize = GetMarkerSize(configuration, context);
            if (!context.CanReadBytes(markerSize))
            {
                throw new InvalidOperationException("Unable to read next type marker from context");
            }
            var markerBytes = context.PeekBytes(markerSize);
            var nextType = FindTypeForMarker(configuration, markerBytes);

            _typesCounter++;
            return nextType;
        }
 public List<byte[]> Split(long sizeOffset, long sizeLength, BinaryContext context)
 {
     var result = new List<byte[]>();
     while (!context.EndOfContextReached())
     {
         var sizeValue = context.PeekBytes(sizeOffset, sizeLength);
         var size = ConvertSize(sizeValue);
         if (context.CanReadBytes(size))
         {
             result.Add(context.ReadBytes(size));
         }
         else throw new EndOfStreamException("Cannot read next block of size " + size);
     }
     return result;
 }
 protected long GetMarkerSize(Configuration configuration, BinaryContext context)
 {
     long markerSize;
     MetadataBase markerSizeMetadata =
         configuration.Metadata.Find(p => p.MetadataType == MetadataTypes.TypeMarkerSize);
     if (markerSizeMetadata is ValueMetadata)
     {
         markerSize = Int64.Parse(((ValueMetadata) markerSizeMetadata).Value);
     }
     else
     {
         var offsetMetadata = (OffsetMetadata) markerSizeMetadata;
         byte[] sizeBytes = context.PeekBytes(offsetMetadata.Offset, offsetMetadata.Length);
         markerSize = ConvertSize(sizeBytes);
     }
     return markerSize;
 }
 private byte[] RetrieveMarker(Configuration configuration, BinaryContext context)
 {
     byte[] result = null;
     var marker = configuration.Metadata.Find(p => p.MetadataType == MetadataTypes.RecordSeparatingMarker);
     if (marker is OffsetMetadata)
     {
         var offsetMarker = (OffsetMetadata) marker;
         result = context.PeekBytes(offsetMarker.Offset, offsetMarker.Length);
     }
     if (marker is ValueMetadata)
     {
         var valueMarker = (ValueMetadata) marker;
         result = ConvertToBytes(valueMarker.Value);
     }
     if (result != null) return result;
     throw new InvalidOperationException("Cannot determine the record marker");
 }