You may not NEED to optimize the code. Be sure that you do and measure the cost of your rendering function before you start tinkering with it. If you decide some optimizations are necessary, measure again after you're done to be sure you didn't make the problem worse!
You only see one screen's worth of stuff so rendering the entire world is a waste. Let's say you have X and Y coordinates for your player. You can calculate a rectangle of world coordinates that you should draw by drawing everything within 30 tiles of your player (or whatever number works for your game). Subtract 30 * tileWidth from player.x and add 30 * tileHeight to player.x to get your minX and maxX values. Do the same for your min/max Y's and then only draw the tiles and enemies that are within that range.
Here's a post that explains that idea in a little more detail, along with some other tricks for reducing texture swapping costs.
As far as serialization goes, it's just a matter of coming up with a logical file format. Since you're using SFML, have a look at the tutorials for user data streams:
If you're saving your "world" it could be as simple as outputting your x and y coordinates along with the tile id into a text file one line at a time.
Loading it would be just the opposite. You just create one tile for each line you read in, and add that to your world.
There should be PLENTY of tutorials online about file i/o for whatever language you want.
Thanks alot. This is a good start on fixing this issue. I will try and update if it's fixed.