Merge pull request #114 from xujianhai666/feat-boolnil

[ISSUE #113 ]Feat boolnil
diff --git a/encode.go b/encode.go
index 7ae4d05..59ce555 100644
--- a/encode.go
+++ b/encode.go
@@ -151,6 +151,13 @@
 			return e.encList(v)
 		case reflect.Map: // the type must be map[string]int
 			return e.encMap(v)
+		case reflect.Bool:
+			vv := v.(*bool)
+			if vv != nil {
+				e.buffer = encBool(e.buffer, *vv)
+			} else {
+				e.buffer = encBool(e.buffer, false)
+			}
 		default:
 			if p, ok := v.(POJOEnum); ok { // JavaEnum
 				return e.encObject(p)
diff --git a/object.go b/object.go
index 39b7385..71de3c1 100644
--- a/object.go
+++ b/object.go
@@ -389,7 +389,18 @@
 			if err != nil {
 				return nil, perrors.Wrapf(err, "decInstance->Decode field name:%s", fieldName)
 			}
-			fldRawValue.SetBool(b.(bool))
+			v, ok := b.(bool)
+			if !ok {
+				return nil, perrors.Wrapf(err, "value convert to bool failed, field name:%s", fieldName)
+			}
+
+			if fldRawValue.Kind() == reflect.Ptr && fldRawValue.CanSet() {
+				if b != nil {
+					field.Set(reflect.ValueOf(&v))
+				}
+			} else if fldRawValue.Kind() != reflect.Ptr {
+				fldRawValue.SetBool(v)
+			}
 
 		case reflect.Float32, reflect.Float64:
 			num, err := d.decDouble(TAG_READ)
diff --git a/object_test.go b/object_test.go
index dd65b6f..7e3068e 100644
--- a/object_test.go
+++ b/object_test.go
@@ -480,3 +480,48 @@
 		t.Errorf("expect: %v, but get: %v", tuple, decObj)
 	}
 }
+
+type BasePointer struct {
+	A *bool
+}
+
+func (t BasePointer) JavaClassName() string {
+	return "test.base.Base"
+}
+
+func TestBasePointer(t *testing.T) {
+	v := true
+	base := BasePointer{
+		A: &v,
+	}
+	doTestBasePointer(t, &base, &base)
+
+	base = BasePointer{
+		A: nil,
+	}
+	expectedF := false
+	expectedBase := BasePointer{
+		A: &expectedF,
+	}
+	doTestBasePointer(t, &base, &expectedBase)
+}
+
+func doTestBasePointer(t *testing.T, base *BasePointer, expected *BasePointer) {
+	e := NewEncoder()
+	err := e.encObject(base)
+	if err != nil {
+		t.Error(err)
+		t.FailNow()
+	}
+
+	d := NewDecoder(e.buffer)
+	decObj, err := d.Decode()
+	if err != nil {
+		t.Error(err)
+		t.FailNow()
+	}
+
+	if !reflect.DeepEqual(expected, decObj) {
+		t.Errorf("expect: %v, but get: %v", base, decObj)
+	}
+}