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