我无法使用Thrift生成的Types.php的getter和setter。
class Creation {
static $_TSPEC;
public $a_iso = null;
public $date = null;
public function __construct($vals=null) {
if (!isset(self::$_TSPEC)) {
self::$_TSPEC = array(
1 => array(
'var' => 'a_iso',
'type' => TType::I32,
),
2 => array(
'var' => 'date',
'type' => TType::I32,
),
);
}
if (is_array($vals)) {
if (isset($vals['a_iso'])) {
$this->a_iso = $vals['a_iso'];
}
if (isset($vals['date'])) {
$this->date = $vals['date'];
}
}
}
public function read($input)
{
$xfer = 0;
$fname = null;
$ftype = 0;
$fid = 0;
$xfer += $input->readStructBegin($fname);
while (true)
{
$xfer += $input->readFieldBegin($fname, $ftype, $fid);
if ($ftype == TType::STOP) {
break;
}
switch ($fid)
{
case 1:
if ($ftype == TType::I32) {
$xfer += $input->readI32($this->a_iso);
} else {
$xfer += $input->skip($ftype);
}
break;
case 2:
if ($ftype == TType::I32) {
$xfer += $input->readI32($this->date);
} else {
$xfer += $input->skip($ftype);
}
break;
default:
$xfer += $input->skip($ftype);
break;
}
$xfer += $input->readFieldEnd();
}
$xfer += $input->readStructEnd();
return $xfer;
}
public function write($output) {
$xfer = 0;
$xfer += $output->writeStructBegin('Creation');
if ($this->a_iso !== null) {
$xfer += $output->writeFieldBegin('a_iso', TType::I32, 1);
$xfer += $output->writeI32($this->a_iso);
$xfer += $output->writeFieldEnd();
}
if ($this->date !== null) {
$xfer += $output->writeFieldBegin('date', TType::I32, 2);
$xfer += $output->writeI32($this->date);
$xfer += $output->writeFieldEnd();
}
$xfer += $output->writeFieldStop();
$xfer += $output->writeStructEnd();
return $xfer;
}
}
我做了:
$objetcree = new Creation();
$objetcree->a_iso = 45;
好的,但我不想那样使用。
$objetcree->read($input);
如果我只想写a_iso字段,那么如何输入$?
My Thrift结构:
typedef i32 int
struct Creation {
1: int a_iso,
2: int date
}
谢谢!
答案 0 :(得分:1)
谢谢!
对于其他未来读者:
好吧,我花了很多时间才做到这一点,我成功了!
$bins = new TBinarySerializer();
$seria= $bins->serialize($my_thrift_object);
echo $seria;
有效!
$deseria = new Classofmythriftstruct(); //My empty thrift object
$binde = new TBinarySerializer();
$deseria = $binde->deserialize($seria, $deseria);
有效!
我在Java中看到我们可以将协议放在TBinarySerializer()的参数中。 但是在php中,它不起作用!
所以我一直在找,我找到了! 您可以在/lib/php/src/lib/Thrift/Serializer/TBinarySerializer.php中修改TBinarySerializer类,并用您想要的任何协议替换“TCompactProtocol”! TCompactProtocol默认是协议!
谢谢!
现在,我必须将转换器simpleXMLObject转换为thrift对象,或者如果我找到一个低级解析器,我直接使用thrift对象!
然后,用Ruby做到这一点!
之后,我可能会使用Parquet格式......(与Cloudera Impala一起使用) 我将XML文件转换为thrift文件以将它们存储到HDFS中。 直接使用thrift是不可能的,有许多旧的XML文件要转换!
即使我已经过了很多天才明白,这太酷了!
答案 1 :(得分:0)
Input
应该是TProtocol
的一个实例,它从输入流中传递数据。
如果您只想在对象实例上设置一个简单值,那么除非您拥有这样的输入流,否则使用read()
毫无意义。所有其他事情都会成为过度杀伤力。
好的,但我不想那样使用
但是,它就是这样的。你不必真正喜欢它。
如果我只想写a_iso字段,那么如何输入$?
仅为了完整性:格式主要取决于您要使用的协议。您可以使用二进制,JSON和一堆其他格式。根据传输情况,可能需要更多数据。但同样,这种方式没有意义,除非你没有告诉整个故事为什么你想要以如此过于复杂的方式去做。
我有很多xml文件。我想以可持续的方式存储它们[...] XML_file - >对象 - > thrift_object - > binary_file
好的,现在它开始有意义了。我不是PHP专业版,我对细节知之甚少,所以我只能给你一个大纲。但这应该是一个很好的起点。理论上
加载XML文件并将数据反序列化为某种对象结构。在这个阶段,Thrift可以帮助你很多,因为a)没有Thrift XML协议,b)没有""" XML格式 - XML基本上只描述了有效XML文档的语法,而不是具体XML实例中的内容。后者是高度可变的,通常由于DTD或XML Schema而定义。尽管XML Schema或DTD与Thrift IDL之间存在一些相似之处,但它们并没有任何共同之处。
如果您选择的XML解析器框架正在吐出完全实例化的对象,则必须将它们转换为Thrift对象。如果解析器更低级并且为路径,属性和值级别提供数据,则可以在该阶段直接构造Thrift对象。在任何一种情况下,您都可以使用Thrift生成的代码,创建所需目标类的实例,并根据需要设置所有属性。
读取并将足够或全部数据转换为Thrift对象后,您可以使用TBinarySerializer
类并调用serialize()
方法,例如$buffer = $serializer.serialize($object)
。返回的$buffer
包含以二进制格式序列化的数据。
可以在TBinarySerializer
/lib/php/src/lib/Thrift/Serializer
课程