Your ToBytes
method reads the bytes from the current position of the stream to the end of the stream. If the stream is already positioned at the end, it reads zero bytes.
The stream returned by your ToBinary
method is positioned at the end.
Have a look at the MemoryStream.ToArray Method:
MemoryStream.ToArray Method
Writes the stream contents to a byte array, regardless of the Position property.