This took me longer to put together than I'd planned, but here's a gist showing how to use #BinaryFormatter mutation to bypass a #serialization binder: https://gist.github.com/Seibai/d1f52141a800b0538138f9644b855c5f
The binder in this example just outputs the name of each type it sees to the console. During the first deserialization, the only type the binder sees is Tuple<IComparable, Object>. When that object is serialized and then deserialized again though, it becomes a payload that launches calc.
This scenario shows up more often that you might expect: putting an object into ViewState or into a DB or message queue that uses BinaryFormatter can be sufficient for the second, uncontrolled serialization.