Here's a possibly analogous example from some Network Stream wrappers I have.
Shown from top left rotating clockwise, I have
a VI Tester test that checks nested data is restored when passing a child class (equivalent to your specific Messages)
the front panel of "Data to String.vi": this is a class member, but it doesn't need to be. It's not DD, and it doesn't access private data. The block diagram is shown to the left (in the middle).
the FP for "String to Data.vi": again, so long as the VI can access the parent class constant, it doesn't need to be a class member. You would replace my class with Message.lvclass here. (As an aside, I don't think that the 'Remaining data?' output is necessary, and it had better never be true!)
The class hierarchy diagram. Here you can see the yellow, default icon class used for testing is a child of my chosen datatype class for transfer.
p.s. for the testing purists, there are other tests that don't have combined checks on reading AND writing, so if one part fails, I have a different test which when failing/passing would help highlight the problem 🙂
Edit: So following the realisation prompted by writing this post, I removed the conversion files from the class and placed them in only the library. This allows changing them to Private scope, and neatly removes them from the files publicly exported in my PPL. Unit Tests still pass, so feeling good!