The :not(:empty) must be select elements that have some value, obviously.
If I use:
$('select:not(:empty)');
I'll get the same problem.
The jQuery think that the select is filled, but your real value is "" (empty, without value).
This generate this on serialize(): "test=", where must be don't show anything.
Some valid examples:
<input type="text" name="empty"/>
$(':not(:empty))').length == 0 // serialized: <empty>
<input type="text" name="empty" value="test"/>
$(':not(:empty))').length == 1 // serialized: empty=test
Bye.