Serialization is the generated code's own specialized loop over protobuf-java's CodedOutputStream; this trait only adds the conveniences that do not depend on the message's shape. Reflective access goes through getFieldByNumber, which returns base values - the proto-level type, with any TypeMapper already undone - so the generic machinery in DynamicMessages never has to know about custom types.
The base-typed value of one field, or null when the number is not a field of this message.
The base-typed value of one field, or null when the number is not a field of this message.
Shapes, mirroring the generated constructor: Option[T] for a field with explicit presence, Vector[T] for a repeated field, Map[K, V] for a map field, and the bare value for a field with implicit presence. A oneof member reads as Some only while that case is the active one.