PHP中的Getter / Setters与Thrift?

时间:2014-05-27 09:23:07

标签: php thrift

我无法使用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
}

谢谢!

2 个答案:

答案 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专业版,我对细节知之甚少,所以我只能给你一个大纲。但这应该是一个很好的起点。理论上

  1. 加载XML文件并将数据反序列化为某种对象结构。在这个阶段,Thrift可以帮助你很多,因为a)没有Thrift XML协议,b)没有""" XML格式 - XML基本上只描述了有效XML文档的语法,而不是具体XML实例中的内容。后者是高度可变的,通常由于DTD或XML Schema而定义。尽管XML Schema或DTD与Thrift IDL之间存在一些相似之处,但它们并没有任何共同之处。

  2. 如果您选择的XML解析器框架正在吐出完全实例化的对象,则必须将它们转换为Thrift对象。如果解析器更低级并且为路径,属性和值级别提供数据,则可以在该阶段直接构造Thrift对象。在任何一种情况下,您都可以使用Thrift生成的代码,创建所需目标类的实例,并根据需要设置所有属性。

  3. 读取并将足够或全部数据转换为Thrift对象后,您可以使用TBinarySerializer类并调用serialize()方法,例如$buffer = $serializer.serialize($object)。返回的$buffer包含以二进制格式序列化的数据。

  4. 可以在TBinarySerializer

    下找到/lib/php/src/lib/Thrift/Serializer课程