update
diff --git a/agent/log/agent/agent.2019-06-19.log b/agent/log/agent/agent.2019-06-19.log
index 1125ea1..2613016 100644
--- a/agent/log/agent/agent.2019-06-19.log
+++ b/agent/log/agent/agent.2019-06-19.log
Binary files differ
diff --git a/common/protocol/fsof/DubboParser.php b/common/protocol/fsof/DubboParser.php
index 43823d2..f820851 100644
--- a/common/protocol/fsof/DubboParser.php
+++ b/common/protocol/fsof/DubboParser.php
@@ -3,6 +3,7 @@
 namespace com\fenqile\fsof\common\protocol\fsof;
 
 use com\fenqile\fsof\consumer\Type;
+
 /**
  *
  * Dubbo网络协议
@@ -42,6 +43,11 @@
 
     const DUBBO_PROTOCOL_SERIALIZE_HESSIAN2 = 2;     //hessian2 serialization code
 
+    const DUBBO_PROTOCOL_NAME_MAP_CODE = [
+        'hessian2' => self::DUBBO_PROTOCOL_SERIALIZE_HESSIAN2,
+        'fastjson' => self::DUBBO_PROTOCOL_SERIALIZE_FAST_JSON
+    ];
+
 
     //fsof协议包头cmd字段含义
     const FLAG_REQUEST = 0x80;           //request
@@ -65,44 +71,16 @@
 
     public function packRequest(DubboRequest $request)
     {
-        $reqData = json_encode($request->getDubboVersion()) . PHP_EOL .
-            json_encode($request->getService()) . PHP_EOL;
-        if($request->getVersion()){
-            $reqData .= json_encode($request->getVersion()) . PHP_EOL;
-        }else{
-            $reqData .= '""' . PHP_EOL;
+        if (self::DUBBO_PROTOCOL_SERIALIZE_HESSIAN2 == self::DUBBO_PROTOCOL_NAME_MAP_CODE[$request->getSerialization()]) {
+            $reqData = $this->buildHessian2Body($request);
+            $serialize_type = self::DUBBO_PROTOCOL_SERIALIZE_HESSIAN2;
+        } else {
+            $reqData = $this->buildFastJsonBody($request);
+            $serialize_type = self::DUBBO_PROTOCOL_SERIALIZE_FAST_JSON;
         }
-        $reqData .= json_encode($request->getMethod()) . PHP_EOL;
-        $typeStr = "";
-        foreach ($request->getTypes() as $type){
-            $typeStr .= $type;
-        }
-        $reqData .= json_encode($typeStr) . PHP_EOL;
-        foreach ($request->getParams() as $value){
-            if($value instanceof \stdClass){
-                $value = $value->object;
-            }elseif($value instanceof Type){
-                $value = $value->value;
-            }
-            $reqData .= json_encode($value) . PHP_EOL;
-        }
-
-        $attach = array();
-        $attach['path'] = $request->getService();
-        $attach['interface'] = $request->getService();
-        if($request->getGroup()){
-            $attach['group'] = $request->getGroup();
-        }
-        if($request->getVersion()){
-            $attach['version'] = $request->getVersion();
-        }
-        $attach['timeout'] = $request->getTimeout();
-        $request->setAttach($attach);
-        $reqData = $reqData . json_encode($request->getAttach());
-echo $reqData;
         $upper = ($request->getSn() & self::UPPER_MASK) >> 32;
         $lower = $request->getSn() & self::LOWER_MASK;
-        $flag = (self::FLAG_REQUEST | self::DUBBO_PROTOCOL_SERIALIZE_FAST_JSON);
+        $flag = (self::FLAG_REQUEST | $serialize_type);
         if ($request->isTwoWay()) $flag |= self::FLAG_TWOWAY;
         if ($request->isHeartbeatEvent()) $flag |= self::FLAG_HEARTBEAT_EVENT;
         $out = pack("n1C1a1N1N1N1",
@@ -115,13 +93,91 @@
         return $out . $reqData;
     }
 
+    public function buildFastJsonBody(DubboRequest $request)
+    {
+        $reqData = json_encode($request->getDubboVersion()) . PHP_EOL .
+            json_encode($request->getService()) . PHP_EOL;
+        if ($request->getVersion()) {
+            $reqData .= json_encode($request->getVersion()) . PHP_EOL;
+        } else {
+            $reqData .= '""' . PHP_EOL;
+        }
+        $reqData .= json_encode($request->getMethod()) . PHP_EOL;
+        $reqData .= json_encode($this->typeRefs($request)) . PHP_EOL;
+        foreach ($request->getParams() as $value) {
+            if ($value instanceof \stdClass) {
+                $value = $value->object;
+            } elseif ($value instanceof Type) {
+                $value = $value->value;
+            }
+            $reqData .= json_encode($value) . PHP_EOL;
+        }
+        $attach = array();
+        $attach['path'] = $request->getService();
+        $attach['interface'] = $request->getService();
+        if ($request->getGroup()) {
+            $attach['group'] = $request->getGroup();
+        }
+        if ($request->getVersion()) {
+            $attach['version'] = $request->getVersion();
+        }
+        $attach['timeout'] = $request->getTimeout();
+        $request->setAttach($attach);
+        $reqData .= json_encode($request->getAttach());
+        return $reqData;
+
+    }
+
+    public function buildHessian2Body(DubboRequest $request)
+    {
+        $hess_stream = new \HessianStream();
+        $hess_options = new \HessianOptions();
+        $hess_factory = new \HessianFactory();
+        $writer = $hess_factory->getWriter($hess_stream, $hess_options);
+        $reqData = '';
+        $reqData .= $writer->writeValue($request->getDubboVersion());
+        $reqData .= $writer->writeValue($request->getService());
+        if ($request->getVersion()) {
+            $reqData .= $writer->writeValue($request->getVersion());
+        } else {
+            $reqData .= $writer->writeValue('');
+        }
+        $reqData .= $writer->writeValue($request->getMethod());
+        $reqData .= $writer->writeValue($this->typeRefs($request));
+        foreach ($request->getParams() as $value) {
+            if ($value instanceof \stdClass) {
+                $value = $value->object;
+            } elseif ($value instanceof Type) {
+                $value = $value->value;
+            }
+            $reqData .= $writer->writeValue($value);
+        }
+        $attach = ['path' => $request->getService(), 'interface' => $request->getService(), 'timeout' => $request->getTimeout()];
+        if ($request->getGroup()) {
+            $attach['group'] = $request->getGroup();
+        }
+        if ($request->getVersion()) {
+            $attach['version'] = $request->getVersion();
+        }
+        $reqData .= $writer->writeValue($attach);
+        return $reqData;
+    }
+
+    private function typeRefs(DubboRequest $request)
+    {
+        $typeRefs = '';
+        foreach ($request->getTypes() as $type) {
+            $typeRefs .= $type;
+        }
+        return $typeRefs;
+    }
+
 
     public function parseResponseHeader(DubboResponse $response)
     {
         $res_header = substr($response->getFullData(), 0, self::PACKAGE_HEDA_LEN);
         $format = 'n1magic/C1flag/C1status/N1upper/N1lower/N1len';
         $_arr = unpack($format, $res_header);
-        print_r($_arr);
         $response->setStatus($_arr['status']);
         $response->setSn($_arr["upper"] << 32 | $_arr["lower"]);
         $flag = $_arr["flag"];
@@ -159,7 +215,7 @@
                     default:
                         return false;
                 }
-            } else if(self::DUBBO_PROTOCOL_SERIALIZE_HESSIAN2  == $response->getSerialization() ){
+            } else if (self::DUBBO_PROTOCOL_SERIALIZE_HESSIAN2 == $response->getSerialization()) {
                 $_data = substr($_data, 1);
                 $hess_stream = new \HessianStream($_data);
                 $hess_options = new \HessianOptions();
diff --git a/common/url/FSOFUrl.php b/common/url/FSOFUrl.php
index 7b5637a..f9042a0 100644
--- a/common/url/FSOFUrl.php
+++ b/common/url/FSOFUrl.php
@@ -35,6 +35,7 @@
     const URL_CATEGORY = 'category';
 
 	const URL_WEIGHT = 'weight';
+	const URL_SERIALIZATION = 'serialization';
 
     private $originUrl = NULL;
     private $encodedUrl = NULL;
@@ -50,6 +51,7 @@
     private $version = NULL;
     private $params = NULL;
 	private $weight = NULL;
+	private $serialization = NULL;
 
     private $logger;
 
@@ -147,6 +149,11 @@
 			{
 				$this->service = $getArgs[self::URL_SERVICE];
 			}
+
+			if(isset($getArgs[self::URL_SERIALIZATION]))
+            {
+                $this->serialization = $getArgs[self::URL_SERIALIZATION];
+            }
 		}
 
         $this->joinUrlStr();
@@ -270,6 +277,23 @@
 		$this->weight = $weight;
 	}
 
+	public function getSerialization($defaultValue = NULL)
+    {
+        if(empty($this->serialization))
+        {
+            return $defaultValue;
+        }
+        else
+        {
+            return $this->serialization;
+        }
+    }
+
+	public function setSerialization($serialization)
+    {
+        $this->serialization = $serialization;
+    }
+
 	public function getParams($key)
 	{
 		return $this->getparam($key);
diff --git a/consumer/fsof/FSOFProcessor.php b/consumer/fsof/FSOFProcessor.php
index f406fd3..fd854b5 100644
--- a/consumer/fsof/FSOFProcessor.php
+++ b/consumer/fsof/FSOFProcessor.php
@@ -67,6 +67,7 @@
                 $request->setGroup($svrUrl->getGroup());
                 $request->setVersion( $svrUrl->getVersion());
                 $request->setTimeout($ioTimeOut * 1000);
+                $request->setSerialization($svrUrl->getSerialization(DubboParser::DUBBO_PROTOCOL_SERIALIZE_FAST_JSON));
 
                 $client = $this->connectProvider($host, $port, $ioTimeOut);
                 if(empty($client))