@evildictaitor: Yes, that's how it works, and the only way out would be to inject special cases for some specific type, which would be a bad idea and is probably impossible right now.

This is not much of an issue with reference types, as the remoting binary format has a way to collapse multiple nulls. This won't work for value types, though, as a similar mechanism would require the runtime to check if a struct is equal to its default value.

Two easy workarounds come to mind:

1) Switch from a struct to a class. That's a heck of a breaking change, granted, but it may be worthwhile depending on how much you serialize and the reason why a value type was chosen in the first place.

2) Alternatively, just trim the List<T> at serialization:

formatter.Serialize (list.ToArray ());

Deserialization will produce an array that can be readily wrapped into a List<T> if needed.