One of the practices I adopted when I first started writing ASP.NET applications was to put the [Serializable] attribute on all model/DTO classes I wrote. The reason is because if the class was serialized into a Session or Cache object, this attribute would make sure the object serialized correctly.
I was burned early on when I didn't use the [Serializable] attribute because our development environments used InProc Sessions (single server), so the Serializable issues didn't surface until the web apps were deployed to a production web farm that used Out-of-Process Session State. In other words, the serialization errors would only crop up in production.
What I'm wondering if it is still the best practice to use the [Serializable] attribute for all model/DTO classes. There are some side effects using with ASP.NET MVC and Web API apps. Such as dealing with backing fields. There are options to remove the backing field prefixes. Unfortunately this breaks the auto property mapping when forms are posted back in MVC because properties don't contain the backing fields prefix.