Склоняюсь к мысли не описывать схему в самом сериализованном сообщении, а описать класс, который будет там сериализован. Соответственно, когда класс десериализует сообщение, он просто мапит поля сообщения на свои атрибуты, поимённо. Если какой-то атрибут класса — другой класс, то этот другой класс и создаётся.