I don't understand what you mean. If you want to serialize/deserialize your own data types, you can just derive the pertinent traits on them. No duplication of code or type declarations is needed.
Then you'll need to use two separate serialization format libraries. Serde in itself is generic and doesn't perform any serialization. It merely maps your data structure to a tree of primitives and general collections. Turning that into an intelligible serialized representation is the job of serialization formats.
This way you can implement generically the part of your logic which is common for String and AST representations, while the conversion between them would look something like
impl From<GameObject<String>> for GameObject<Ast> { ... }
At worst, if your logic turns out to bee non-generic, you can implement functions for GameObject<String> and GameObject<Ast> separately. Note that you can't have functions with the same name on those types.
Yes, that's the suggestion. Whether it's reasonable for your particular use case I can't say without knowing more. The core question is how much of your logic is really generic, and how complex would be the required trait bounds.