public T[] Deserialize(Stream source) { ResizingArray <T> ret = new ResizingArray <T>(); while (source.Position < source.Length) { ret.Add(_inner.Deserialize(source)); } return(ret.arr); }
private T DeserializeWithSeek(Stream source) { int bufferSize = Chunksize + terminatorToken.Length; ResizingArray <byte> retBytes = new ResizingArray <byte>(); while (true) { var buffer = new byte[bufferSize]; int endTake = terminatorToken.Length; if (retBytes.Count < endTake) { endTake = retBytes.Count; } int writeSkip = terminatorToken.Length - endTake; retBytes.Skip(retBytes.Count - endTake).CopyTo(buffer, writeSkip); int written = source.Read(buffer, terminatorToken.Length, Chunksize); if (written == 0) { if (demandTerminator) { throw new EndOfStreamException("stream ended without terminator " + terminatorToken); } break; } var bufferView = Enumerable.Take(buffer, written + terminatorToken.Length); var searchArea = bufferView.Skip(terminatorToken.Length); var foundSubs = searchArea.SearchForSub(terminatorToken); int terminatorIndex = foundSubs.FirstOrDefault((-1, null)).startIndex; if (terminatorIndex == -1) { retBytes.AddRange(bufferView.Skip(terminatorToken.Length)); } else { int readTooMuch = written - terminatorIndex - terminatorToken.Length; retBytes.AddRange(Enumerable.Skip(buffer.Take(terminatorIndex + terminatorToken.Length), terminatorToken.Length)); source.Position -= readTooMuch; break; } } return(inner.deserialize(retBytes.arr)); }
private T DeserializeWithoutSeek(Stream source) { ResizingArray <byte> retBytes = new ResizingArray <byte>(); int chop = terminatorToken.Length; while (retBytes.Count < terminatorToken.Length || !retBytes.Skip(retBytes.Count - terminatorToken.Length).SequenceEqual(terminatorToken)) { int b = source.ReadByte(); if (b == -1) { if (demandTerminator) { throw new EndOfStreamException("stream ended without terminator " + terminatorToken); } chop = 0; break; } retBytes.Add((byte)b); } return(inner.deserialize(retBytes.arr, 0, retBytes.arr.Length - chop)); }