This point is pretty obvious: when serializing objects in order to pass them through a service boundry, you should not bother to serialize the delegates. Since a delegate is a pointer to some method on some object in your memory space, that target object that the delegate points to probably doesn't exist in the memory space of the other machine! You will encounter this scenario if you create custom events on your business objects and then serialize them through WCF. Remember that a .NET event is just a list of delegates (commonly called the event's invocation list).
There are two issues that make this problem particularly onerous. First, if there are no subscribers to the event, the serialization works just fine! So your unit tests may work perfect - unless you are the one anal fool that unit tests subscribing to events and serializing those objects. Second, back in the UI, it may not be your code - it may be framework code - that is subscribing to these events and you will only get the SerializationException after you have databound the objects to UI controls and then try to serialize the databound objects. This will happen if for some crazy reason you want to implement INotifyPropertyChanged on your business entities.
Fortunately, the problem is pretty obvious when you encounter it. The excetpion message you get in the .NET 3.0 DataContractSerializer is :
"Type 'System.DelegateSerializationHolder+DelegateEntry' with data contract name 'DelegateSerializationHolder.DelegateEntry:http://schemas.datacontract.org/2004/07/System' is not expected. Add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer."
Forget .NET's advice. The way to fix it simple. Just mark your event as NonSerialized.
[field: NonSerialized]
publiceventPropertyChangedEventHandler PropertyChanged;
The bottom line rule is to always mark events with the [field:NonSerialized] attribute on classes whose objects will be serialized accross a service boundry.
Reference: Do not serialize delegates and events blindly.