12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- package jsonpb
- import (
- "bytes"
- "sync"
- "github.com/golang/protobuf/jsonpb"
- "github.com/golang/protobuf/proto"
- )
- var marshaller = &jsonpb.Marshaler{EmitDefaults: true, OrigName: true, EnumsAsInts: true}
- func Marshal(pb proto.Message) (string, error) {
- e := newEncodeState()
- if err := marshaller.Marshal(e, pb); err != nil {
- return "", err
- }
- s := e.String()
- e.Reset()
- encodeStatePool.Put(e)
- return s, nil
- }
- func MarshalBytes(pb proto.Message) ([]byte, error) {
- e := newEncodeState()
- if err := marshaller.Marshal(e, pb); err != nil {
- return nil, err
- }
- buf := append([]byte(nil), e.Bytes()...)
- e.Reset()
- encodeStatePool.Put(e)
- return buf, nil
- }
- // An encodeState encodes proto into a bytes.Buffer.
- type encodeState struct {
- *bytes.Buffer
- }
- var encodeStatePool sync.Pool
- func newEncodeState() *encodeState {
- if v := encodeStatePool.Get(); v != nil {
- e := v.(*encodeState)
- e.Reset()
- return e
- }
- return &encodeState{Buffer: bytes.NewBuffer(make([]byte, 0, 2048))}
- }
|