public Block getBlock(SerializedBlockImpl serializedBlock, TypeMetadata meta) {
		BlockPtr ptr = serializedBlock.getPtr();

		ChannelBuffer buffer = serializedBlock.getData();
		
		BlockHeader header = BlockHeaderSerializer.getInstance().getHeader(buffer);
		
		BlockPtr nextPtr = (BlockPtr) Serializer.getInstance().getObject(SerializerManager.BLOCK_PTR, buffer, meta);
		BlockPtr prevPtr = (BlockPtr) Serializer.getInstance().getObject(SerializerManager.BLOCK_PTR, buffer, meta);
		int reserved = buffer.readInt();
		BlockPtr parentPtr = null;
		
		TypeMetadata newMeta = meta;
		
		Block block = null;
		int maxPosn = -1;
		if (header.isIndexBlock() || header.isIndexBranchBlock()) {
			parentPtr = (BlockPtr) Serializer.getInstance().getObject(SerializerManager.BLOCK_PTR, buffer, meta);			
		} else {
			maxPosn = buffer.readInt();
		}
		
		if (header.isIndexBranchBlock()) {
			block = new IndexBranchBlock(ptr);
			block.setParent(parentPtr);
		} else if (header.isIndexBlock()) {
			block = new IndexLeafBlock(ptr);
			block.setParent(parentPtr);
		} else {
			block = new ListBlock(ptr);
			((ListBlock) block).setMaxPosn(maxPosn);
		}
		
		block.setNext(nextPtr);
		block.setPrev(prevPtr);
		block.setLastAccessTime(System.currentTimeMillis());
		
		int size = buffer.readInt();
		List<Record> list = new ArrayList<Record>(size);
		block.setData(list);
		for (int i = 0; i < size; i++) {
			Record record = null;
			if (header.isIndexBranchBlock()) {
				newMeta = new ColumnSerializerMetadata(SerializerManager.BLOCK_PTR);
				record = ObjectRecordSerializer.getInstance().readMinimum(header, buffer, newMeta);
			} else if (header.isIndexBlock()) {
				record = ObjectRecordSerializer.getInstance().readMinimum(header, buffer, meta);
			} else if (meta instanceof TableRecordMetadata){
				int posn = buffer.readInt();
				record = TableRecordSerializer.getInstance().readMinimum(buffer, meta);
				((ListRecord) record).setRecordId(new RecordId(ptr, posn));
			} else {
				int posn = buffer.readInt();
				record = ObjectRecordSerializer.getInstance().readMinimum(header, buffer, meta);				
				((ListRecord) record).setRecordId(new RecordId(ptr, posn));
			}
			list.add(record);
		}
		return block;
	}