THRIFT-2159 Serializer/Deserializer for Go

Patch: Justin Judd
diff --git a/lib/go/thrift/serializer.go b/lib/go/thrift/serializer.go
new file mode 100644
index 0000000..bb6a2c8
--- /dev/null
+++ b/lib/go/thrift/serializer.go
@@ -0,0 +1,74 @@
+package thrift
+
+type TSerializer struct {
+	Transport TTransport
+	Protocol  TProtocol
+}
+
+type TStruct interface {
+	Write(p TProtocol) error
+	Read(p TProtocol) error
+}
+
+func NewTSerializer() *TSerializer {
+	var transport TTransport
+	transport = NewTMemoryBufferLen(1024)
+
+	protocol := NewTBinaryProtocolFactoryDefault().GetProtocol(transport)
+
+	return &TSerializer{
+		transport,
+		protocol}
+}
+
+func (t *TSerializer) WriteString(msg TStruct) (s string, err error) {
+	s = ""
+	err = nil
+
+	if err = msg.Write(t.Protocol); err != nil {
+		return
+	}
+
+	if err = t.Protocol.Flush(); err != nil {
+		return
+	}
+	if err = t.Transport.Flush(); err != nil {
+		return
+	}
+
+	var buf []byte
+	var place int
+	buf = make([]byte, 1024)
+	if place, err = t.Transport.Read(buf); err != nil {
+		return
+	}
+
+	s = string(buf[:place])
+	return
+}
+
+func (t *TSerializer) Write(msg TStruct) (b []byte, err error) {
+	err = nil
+
+	if err = msg.Write(t.Protocol); err != nil {
+		return
+	}
+
+	if err = t.Protocol.Flush(); err != nil {
+		return
+	}
+
+	if err = t.Transport.Flush(); err != nil {
+		return
+	}
+
+	var buf []byte
+	var place int
+	buf = make([]byte, 1024)
+	if place, err = t.Transport.Read(buf); err != nil {
+		return
+	}
+
+	b = buf[:place]
+	return
+}