Следует учитывать, что в сериализуемых классах теги SerializableAttribute помечены в отличие от реализации интерфейса.Начиная с MSDN :
Любой класс, который может быть сериализован, должен быть помечен атрибутом SerializableAttribute.Если класс должен управлять процессом сериализации, он может реализовать интерфейс ISerializable.
Что вам нужно сделать, так это создать собственный класс, реализующий интерфейс IDictioanry и каждыйкогда кто-то вызывает add, используйте отражение, чтобы проверить, имеет ли переданный элемент сериализуемый атрибут (и, если нет, сгенерировать исключение).
Код будет выглядеть примерно так:
class MyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
private Dictionary<TKey, TValue> d;
public void Add(TKey key, TValue value)
{
if( value.GetType().IsSerializable )
{
d.Add(key, value);
}
else
{
throw new ArgumentException();
}
}
.....
}