Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions phpserialize/decoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@ import (
"strings"
)

// PhpDecoder is decoder structure
type PhpDecoder struct {
source *strings.Reader
}

// Decode decodes a serialized string
func Decode(value string) (result interface{}, err error) {
decoder := &PhpDecoder{
source: strings.NewReader(value),
Expand All @@ -20,9 +22,10 @@ func Decode(value string) (result interface{}, err error) {
return
}

//all integer is int64,float number is float64
//DecodeValue decodes a serialized value (all integer is int64,float number is float64)
func (decoder *PhpDecoder) DecodeValue() (value interface{}, err error) {
if token, _, err := decoder.source.ReadRune(); err == nil {
token, _, err := decoder.source.ReadRune()
if err == nil {
if token == 'N' {
err = decoder.expect(VALUES_SEPARATOR)
return nil, err
Expand Down Expand Up @@ -69,6 +72,7 @@ func (decoder *PhpDecoder) DecodeValue() (value interface{}, err error) {
value, err = decoder.decodeObject()
}
}

return value, err
}

Expand All @@ -95,7 +99,7 @@ func (decoder *PhpDecoder) decodeArray() (value map[interface{}]interface{}, err
if arrLen, _err := strconv.Atoi(rawArrlen); _err != nil {
err = fmt.Errorf("Can not convert array length %v to int:%v", rawArrlen, _err)
} else {
decoder.expect('{')
err = decoder.expect('{')
for i := 0; i < arrLen; i++ {
if k, _err := decoder.DecodeValue(); _err != nil {
err = fmt.Errorf("Can not read array key %v", _err)
Expand All @@ -105,12 +109,16 @@ func (decoder *PhpDecoder) decodeArray() (value map[interface{}]interface{}, err
switch t := k.(type) {
default:
err = fmt.Errorf("Unexpected key type %T", t)
case string, int64, float64:
case string:
value[k] = v
case int64:
value[int(k.(int64))] = v
case float64:
value[int(k.(float64))] = v
}
}
}
decoder.expect('}')
err = decoder.expect('}')
}
} else {
err = errors.New("Can not read array length")
Expand Down
14 changes: 14 additions & 0 deletions phpserialize/encoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ func encodeValue(buf *bytes.Buffer, value interface{}) (err error) {
buf.WriteString("a")
buf.WriteRune(TYPE_VALUE_SEPARATOR)
err = encodeArrayCore(buf, t)
case []interface{}:
buf.WriteString("a")
buf.WriteRune(TYPE_VALUE_SEPARATOR)
err = encodeSlice(buf, t)
case *PhpObject:
buf.WriteString("O")
buf.WriteRune(TYPE_VALUE_SEPARATOR)
Expand Down Expand Up @@ -100,3 +104,13 @@ func encodeArrayCore(buf *bytes.Buffer, arrValue map[interface{}]interface{}) (e
buf.WriteRune('}')
return err
}

func encodeSlice(buf *bytes.Buffer, sliceValue []interface{}) (err error) {
arrValue := make(map[interface{}]interface{}, 0)

for i, val := range sliceValue {
arrValue[i] = val
}

return encodeArrayCore(buf, arrValue)
}