SPARK-12321 add a framework based on reflection that can serialize TreeNode to JSON and deserialize it back. However, it can't handle all corner cases and we bypass them in the test, see https://github.com/apache/spark/pull/10311/files#diff-238d584c15e16c24f49a40bcf163fe13R190 and https://github.com/apache/spark/pull/10311/files#diff-238d584c15e16c24f49a40bcf163fe13R212.
known corner cases:
3. hive logical plan
4. physical plan
The framework is in catalyst module and may not be able to handle corner cases from other modules, an idea is defining a JsonSerializable trait and implement it for corner cases.