code: def read_array(fo, writer_schema, reader_schema=None):
      
      if reader_schema:
          def item_reader(fo, w_schema, r_schema):
              return read_data(fo, w_schema['items'], r_schema['items'])
      else:
          def item_reader(fo, w_schema, _):
              return read_data(fo, w_schema['items'])
  
      read_items = []
  
      block_count = read_long(fo)
  
      while block_count != 0:
          if block_count < 0:
              block_count = -block_count
              # Read block size, unused
              read_long(fo)
  
          for i in xrange(block_count):
              read_items.append(item_reader(fo, writer_schema, reader_schema))
          block_count = read_long(fo)
  
      return read_items
docs: Arrays are encoded as a series of blocks.
  
      Each block consists of a long count value, followed by that many array
      items.  A block with count zero indicates the end of the array.  Each item
      is encoded per the array's item schema.
  
      If a block's count is negative, then the count is followed immediately by a
      long block size, indicating the number of bytes in the block.  The actual
      count in this case is the absolute value of the count written.