我从 C++ 中的另一台服务器和 php 中的另一台服务器获取 protobuf 消息(语法 2),我收到相同的 protobuf 消息(语法 3)。现在我的目的是解码该消息。
以下是文件:
.proto 文件:
syntax="proto3";
message ModuleDescriptor {
string name = 1;
string identifier = 2;
string version = 3;
float frequency = 4;
}
message RuntimeStatistic {
double sliceConsumption = 1;
}
message ModuleStatistic {
ModuleDescriptor module = 1;
RuntimeStatistic runtimeStatistic = 2;
}
message ModuleStatistics {
repeated ModuleStatistic moduleStatistics = 1; //this is the message that i receive
}
这个 proto 文件生成 4 个类。这是类 ModuleStatistics:
<?php
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: ModuleStatistics.proto
use Google\Protobuf\Internal\GPBType;
use Google\Protobuf\Internal\RepeatedField;
use Google\Protobuf\Internal\GPBUtil;
/**
* Protobuf type <code>ModuleStatistics</code>
*/
class ModuleStatistics extends \Google\Protobuf\Internal\Message
{
/**
* <code>repeated .ModuleStatistic moduleStatistics = 1;</code>
*/
private $moduleStatistics;
public function __construct() {
\GPBMetadata\ModuleStatistics::initOnce();
parent::__construct();
}
/**
* <code>repeated .ModuleStatistic moduleStatistics = 1;</code>
*/
public function getModuleStatistics()
{
return $this->moduleStatistics;
}
/**
* <code>repeated .ModuleStatistic moduleStatistics = 1;</code>
*/
public function setModuleStatistics(&$var)
{
$arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \ModuleStatistic::class);
$this->moduleStatistics = $arr;
}
}
index.php 文件:
include_once './vendor/autoload.php';
require_once("generated_proto/GPBMetadata/ModuleStatistics.php");
require_once("generated_proto/ModuleDescriptor.php");
require_once("generated_proto/RuntimeStatistic.php");
require_once("generated_proto/ModuleStatistic.php");
require_once("generated_proto/ModuleStatistics.php");
...
$protoClass = new ModuleStatistics(); //MoudleStatitistics is a generated class from protobuff
$protoClass -> mergeFromString($receivedString); //decode the string received from the c++ server
echo $protoClass ->getModuleStatistics(); // getModuleStatisics() is a function in the generated class ModulseStatistics.
...
这是我所有的协议缓冲区代码。
现在,当我尝试进入getModuleStatistics()
函数时,它会抛出这个错误:PHP Catchable fatal error: Object of class ModuleStatistics could not be converted to string in /app/index.php on line 41
mergeFromString()
没有给我任何错误,但它也没有重新运行任何东西。
我只收到 proto 文件的 4 条消息中的 1 条。但正如您所看到的,它是一个嵌套消息。我需要接收所有 4 条消息吗?然后也许将它们设置为彼此?