Пример #1
0
        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));
        }