code: func (v *Value) UnmarshalBinary(data []byte) error {
  	reader := bytes.NewReader(data)
  
  	b, err := reader.ReadByte()
  	if err != nil {
  		return err
  	}
  
  	typ := ValueType(b)
  	if typ == NullType {
  		*v = Value{}
  		return nil
  	}
  
  	length, err := binary.ReadUvarint(reader)
  	if err != nil {
  		return err
  	}
  
  	raw := make([]byte, length)
  	n, err := reader.Read(raw)
  	if err != nil {
  		return err
  	}
  
  	if uint64(n) != length {
  		return errors.Newf("Not enough bytes to read Value")
  	}
  
  	switch typ {
  	case NumericType:
  		*v = Value{Numeric(raw)}
  	case FractionalType:
  		*v = Value{Fractional(raw)}
  	case StringType:
  		*v = Value{String{raw, false}}
  	case UTF8StringType:
  		*v = Value{String{raw, true}}
  	default:
  		return errors.Newf("Unknown type %d", int(typ))
  	}
  
  	return nil
  }
docs: // UnmarshalBinary helps implement BinaryUnmarshaler interface for Value.