1
1
package php_serialize
2
2
3
3
import (
4
+ "bytes"
4
5
"fmt"
5
6
"strconv"
6
7
)
@@ -25,7 +26,7 @@ func (self *Serializer) SetSerializedEncodeFunc(f SerializedEncodeFunc) {
25
26
}
26
27
27
28
func (self * Serializer ) Encode (v PhpValue ) (string , error ) {
28
- var value string
29
+ var value bytes. Buffer
29
30
30
31
switch t := v .(type ) {
31
32
default :
@@ -46,22 +47,30 @@ func (self *Serializer) Encode(v PhpValue) (string, error) {
46
47
value = self .encodeSerialized (v )
47
48
}
48
49
49
- return value , self .lastErr
50
+ return value . String () , self .lastErr
50
51
}
51
52
52
- func (self * Serializer ) encodeNull () string {
53
- return string (TOKEN_NULL ) + string (SEPARATOR_VALUES )
53
+ func (self * Serializer ) encodeNull () (buffer bytes.Buffer ) {
54
+ buffer .WriteRune (TOKEN_NULL )
55
+ buffer .WriteRune (SEPARATOR_VALUES )
56
+ return
54
57
}
55
58
56
- func (self * Serializer ) encodeBool (v PhpValue ) string {
57
- val := "0"
59
+ func (self * Serializer ) encodeBool (v PhpValue ) (buffer bytes.Buffer ) {
60
+ buffer .WriteRune (TOKEN_BOOL )
61
+ buffer .WriteRune (SEPARATOR_VALUE_TYPE )
62
+
58
63
if bVal , ok := v .(bool ); ok && bVal == true {
59
- val = "1"
64
+ buffer .WriteString ("1" )
65
+ } else {
66
+ buffer .WriteString ("0" )
60
67
}
61
- return string (TOKEN_BOOL ) + string (SEPARATOR_VALUE_TYPE ) + val + string (SEPARATOR_VALUES )
68
+
69
+ buffer .WriteRune (SEPARATOR_VALUES )
70
+ return
62
71
}
63
72
64
- func (self * Serializer ) encodeNumber (v PhpValue ) (res string ) {
73
+ func (self * Serializer ) encodeNumber (v PhpValue ) (buffer bytes. Buffer ) {
65
74
var val string
66
75
67
76
isFloat := false
@@ -111,74 +120,97 @@ func (self *Serializer) encodeNumber(v PhpValue) (res string) {
111
120
}
112
121
113
122
if isFloat {
114
- res = string (TOKEN_FLOAT )
123
+ buffer . WriteRune (TOKEN_FLOAT )
115
124
} else {
116
- res = string (TOKEN_INT )
125
+ buffer . WriteRune (TOKEN_INT )
117
126
}
118
127
119
- res += string (SEPARATOR_VALUE_TYPE ) + val + string (SEPARATOR_VALUES )
128
+ buffer .WriteRune (SEPARATOR_VALUE_TYPE )
129
+ buffer .WriteString (val )
130
+ buffer .WriteRune (SEPARATOR_VALUES )
131
+
120
132
return
121
133
}
122
134
123
- func (self * Serializer ) encodeString (v PhpValue , left , right rune , isFinal bool ) (res string ) {
135
+ func (self * Serializer ) encodeString (v PhpValue , left , right rune , isFinal bool ) (buffer bytes. Buffer ) {
124
136
val , _ := v .(string )
125
137
126
138
if isFinal {
127
- res = string (TOKEN_STRING )
139
+ buffer . WriteRune (TOKEN_STRING )
128
140
}
129
- res += self .prepareLen (len (val )) + string (left ) + val + string (right )
141
+
142
+ buffer .WriteString (self .prepareLen (len (val )))
143
+ buffer .WriteRune (left )
144
+ buffer .WriteString (val )
145
+ buffer .WriteRune (right )
146
+
130
147
if isFinal {
131
- res += string (SEPARATOR_VALUES )
148
+ buffer . WriteRune (SEPARATOR_VALUES )
132
149
}
150
+
133
151
return
134
152
}
135
153
136
- func (self * Serializer ) encodeArray (v PhpValue , isFinal bool ) (res string ) {
154
+ func (self * Serializer ) encodeArray (v PhpValue , isFinal bool ) (buffer bytes. Buffer ) {
137
155
var (
138
- arrLen int
139
- data , s string
156
+ arrLen int
157
+ s string
140
158
)
141
159
142
160
if isFinal {
143
- res = string (TOKEN_ARRAY )
161
+ buffer . WriteRune (TOKEN_ARRAY )
144
162
}
145
163
146
164
switch v .(type ) {
147
165
case PhpArray :
148
166
arrVal , _ := v .(PhpArray )
149
167
arrLen = len (arrVal )
168
+
169
+ buffer .WriteString (self .prepareLen (arrLen ))
170
+ buffer .WriteRune (DELIMITER_OBJECT_LEFT )
171
+
150
172
for k , v := range arrVal {
151
173
s , _ = self .Encode (k )
152
- data += s
174
+ buffer . WriteString ( s )
153
175
s , _ = self .Encode (v )
154
- data += s
176
+ buffer . WriteString ( s )
155
177
}
156
178
157
179
case map [PhpValue ]PhpValue :
158
180
arrVal , _ := v .(map [PhpValue ]PhpValue )
159
181
arrLen = len (arrVal )
182
+
183
+ buffer .WriteString (self .prepareLen (arrLen ))
184
+ buffer .WriteRune (DELIMITER_OBJECT_LEFT )
185
+
160
186
for k , v := range arrVal {
161
187
s , _ = self .Encode (k )
162
- data += s
188
+ buffer . WriteString ( s )
163
189
s , _ = self .Encode (v )
164
- data += s
190
+ buffer . WriteString ( s )
165
191
}
166
192
}
167
193
168
- res += self .prepareLen (arrLen ) + string (DELIMITER_OBJECT_LEFT ) + data + string (DELIMITER_OBJECT_RIGHT )
194
+ buffer .WriteRune (DELIMITER_OBJECT_RIGHT )
195
+
169
196
return
170
197
}
171
198
172
- func (self * Serializer ) encodeObject (v PhpValue ) string {
199
+ func (self * Serializer ) encodeObject (v PhpValue ) ( buffer bytes. Buffer ) {
173
200
obj , _ := v .(* PhpObject )
174
- return string (TOKEN_OBJECT ) + self .prepareClassName (obj .className ) + self .encodeArray (obj .members , false )
201
+ buffer .WriteRune (TOKEN_OBJECT )
202
+ buffer .WriteString (self .prepareClassName (obj .className ))
203
+ encoded := self .encodeArray (obj .members , false )
204
+ buffer .WriteString (encoded .String ())
205
+ return
175
206
}
176
207
177
- func (self * Serializer ) encodeSerialized (v PhpValue ) (res string ) {
208
+ func (self * Serializer ) encodeSerialized (v PhpValue ) (buffer bytes. Buffer ) {
178
209
var serialized string
179
210
180
211
obj , _ := v .(* PhpObjectSerialized )
181
- res = string (TOKEN_OBJECT_SERIALIZED ) + self .prepareClassName (obj .className )
212
+ buffer .WriteRune (TOKEN_OBJECT_SERIALIZED )
213
+ buffer .WriteString (self .prepareClassName (obj .className ))
182
214
183
215
if self .encodeFunc == nil {
184
216
serialized = obj .GetData ()
@@ -189,7 +221,8 @@ func (self *Serializer) encodeSerialized(v PhpValue) (res string) {
189
221
}
190
222
}
191
223
192
- res += self .encodeString (serialized , DELIMITER_OBJECT_LEFT , DELIMITER_OBJECT_RIGHT , false )
224
+ encoded := self .encodeString (serialized , DELIMITER_OBJECT_LEFT , DELIMITER_OBJECT_RIGHT , false )
225
+ buffer .WriteString (encoded .String ())
193
226
return
194
227
}
195
228
@@ -198,7 +231,8 @@ func (self *Serializer) prepareLen(l int) string {
198
231
}
199
232
200
233
func (self * Serializer ) prepareClassName (name string ) string {
201
- return self .encodeString (name , DELIMITER_STRING_LEFT , DELIMITER_STRING_RIGHT , false )
234
+ encoded := self .encodeString (name , DELIMITER_STRING_LEFT , DELIMITER_STRING_RIGHT , false )
235
+ return encoded .String ()
202
236
}
203
237
204
238
func (self * Serializer ) saveError (err error ) {
0 commit comments