ContentSerializerIgnore does what it says: it ignores it when serializing, and since it won't exist when deserializing, it ignores it when deserializing.
This can be a problem for assets like Effects, Textures, VertexBuffers, etc...
What I did was create a service called ContentProvider which wraps the content manager. When an asset is loaded, I add the asset and its full name to a dictionary so I can reverse map it later. I use a type converter, which can get access to my singleton game class, and convert the asset to and from string using the reverse mapping dictionary. This way things like Effect can be serialized to and from string, the string being the name of the asset. Haven't tried this with ContentSerializer yet, but hopefully it will work.
If not, I have another easier technique to implement. Let's say you have a class with a Texture named MyTex. Put a ContentSerializerIgnore attribute on that property, create another property named MyTextName as a String. Use MyTextName to load / unload the asset, and serialize this value so you know what texture to load when your class is deserialized.