Merge pull request #320 from zhengzepeng/master

if map is pojo, write class name first
diff --git a/map.go b/map.go
index 4f144b8..1336756 100644
--- a/map.go
+++ b/map.go
@@ -122,9 +122,16 @@
 		return nil
 	}
 
+	// if pojo, write class name first
+	if p, ok := m.(POJO); ok {
+		e.buffer = encByte(e.buffer, BC_MAP)
+		e.buffer = encString(e.buffer, p.JavaClassName())
+	} else {
+		e.buffer = encByte(e.buffer, BC_MAP_UNTYPED)
+	}
+
 	keys = value.MapKeys()
 
-	e.buffer = encByte(e.buffer, BC_MAP_UNTYPED)
 	if len(keys) > 0 {
 		typ = value.Type().Key()
 		for i := 0; i < len(keys); i++ {
diff --git a/map_test.go b/map_test.go
index 5fc0855..4d79ecd 100644
--- a/map_test.go
+++ b/map_test.go
@@ -170,3 +170,15 @@
 
 	testDecodeFramework(t, "customReplyListMapListMap", listMapListMap)
 }
+
+type CustomMap map[string]interface{}
+
+func (dict *CustomMap) JavaClassName() string {
+	return "test.model.CustomMap"
+}
+
+func TestJavaMap(t *testing.T) {
+	customMap := &CustomMap{"Name": "Test"}
+	RegisterPOJO(customMap)
+	testJavaDecode(t, "customArgTypedFixed_CustomMap", customMap)
+}
diff --git a/test_hessian/src/main/java/test/TestCustomDecode.java b/test_hessian/src/main/java/test/TestCustomDecode.java
index b97d691..2723e55 100644
--- a/test_hessian/src/main/java/test/TestCustomDecode.java
+++ b/test_hessian/src/main/java/test/TestCustomDecode.java
@@ -20,11 +20,13 @@
 import com.caucho.hessian.io.Hessian2Input;
 import com.caucho.hessian.test.A0;
 import com.caucho.hessian.test.A1;
+
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.*;
 
+import test.model.CustomMap;
 import test.model.DateDemo;
 
 
@@ -214,4 +216,11 @@
         HashSet o = (HashSet) input.readObject();
         return o.contains(0) && o.contains(1);
     }
+
+    public Object customArgTypedFixed_CustomMap() throws Exception {
+        CustomMap o = (CustomMap) input.readObject();
+        String value = (String) o.get("Name");
+        return "Test".equals(value);
+    }
+
 }