(de)serialization is just putting the data into a format from which another process or machine can reconstruct an identical object at a later time. If you can put your object into JSON, like you did as an example, then you're already done. Just build the deserialization at the other end. XML and other formats can work too.
The reason custom, and some built-in objects don't have serialization by default is that they contain data whose use or interpretation is system specific such as time (interpreted differently by timezone), or pointers or network connection objects (system specific). For custom objects that are just lists of simple types, you can just send it through JSON or XML.
Alternatively you can mark it with the Serializable attribute, and use the built in libraries to do the transfer. Generally C# will serialize things just fine without this attribute, but adding it will give you compiler warnings that can help make sure your object is fully serializable. See also this answer https://stackoverflow.com/a/5877839/3626160