В качестве самого хорошего примера сереализации советую рассмотреть
ffjson. Обычно, рефлексией читают поля структуры и их аннотации и опосля кэширует их, ffjson напротив идёт путём кодогенерации. В некоторых случаях (с использованием интерфейсов в структурах) этот подход может быть ещё медленнее чем родной Marshal(), а для большей части прикладных задач, ещё и с использованием SIMD инструкций с SSE4 или SSE2 при работе со строками, получается сравнительно быстро. Ещё стоит глянуть исходники gob
энкодера и декодера и почитать
статью.