I've been looking over the jQuery docs and I think we can do this in one line using selectors:
$("#myForm :input[value]").serialize() // does the job!
Obviously #myForm gets the element with id "myForm" but what was less obvious to me at first was that the space character is needed between #myForm and :input as it is the descendant operator.
:input matches all input, textarea, select and button elements.
[value] matches elements that have the value attribute excluding empty values. The weird (and helpful) thing is that all :input element types have value attributes even selects and checkboxes etc.
Finally to also remove inputs where the value was '.' (as mentioned in the question):
$("#myForm :input[value][value!='.']").serialize()
[value!='.'] is an attribute not equal filter.
In this case juxtaposition, ie placing two attribute selectors next to each other, implies an AND. Using a comma implies an OR. Sorry if that's obvious to CSS people!