diff --git a/src/php/lib/Grpc/AbstractCall.php b/src/php/lib/Grpc/AbstractCall.php
index 40387abdc0727c7d793fb66cf5a667f33c663222..4833fdc7b6f56df58d82709d1ad91f096639cb0f 100644
--- a/src/php/lib/Grpc/AbstractCall.php
+++ b/src/php/lib/Grpc/AbstractCall.php
@@ -131,6 +131,8 @@ abstract class AbstractCall
         // Proto3 implementation
         if (method_exists($data, 'encode')) {
             return $data->encode();
+        } else if (method_exists($data, 'serializeToString')) {
+            return $data->serializeToString();
         }
 
         // Protobuf-PHP implementation
@@ -154,7 +156,11 @@ abstract class AbstractCall
         if (is_array($this->deserialize)) {
             list($className, $deserializeFunc) = $this->deserialize;
             $obj = new $className();
-            $obj->$deserializeFunc($value);
+            if (method_exists($obj, $deserializeFunc)) {
+                $obj->$deserializeFunc($value);
+            } else {
+                $obj->mergeFromString($value);
+            }
 
             return $obj;
         }