PHP中的getter/setter与节俭?

PHP中的getter/setter与节俭?,php,thrift,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)) {

我无法使用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字段,那么$input必须是多少

我的节俭结构:

typedef i32 int
struct Creation {
   1: int a_iso,
   2: int date
}

谢谢大家!

Input
应该是从输入流传递数据的
TProtocol
的实例

当您只想在对象实例上设置一个简单的值时,除非您有这样的输入流,否则使用
read()
是没有意义的。其他一切都将是大功告成

好的,但我不想这样使用

但是,它是这样工作的。你不必真的喜欢它

如果我只想写a_iso字段,那么$input必须是多少

为了完整起见:格式主要取决于您要使用的协议。您可以使用二进制、JSON和一系列其他格式。根据传输情况,可能需要更多的数据。但同样,这种方式没有意义,除非你没有讲述你为什么要以如此复杂的方式做这件事的全部原因


我有很多xml文件。我想可持续地储存它们[…] XML文件->对象->节俭对象->二进制文件

好了,现在开始有意义了。我不是PHP专业人士,也不太了解细节,所以我只能给你提纲。但这应该是一个很好的起点。理论上

  • 加载XML文件并将数据反序列化为某种对象结构。在这个阶段,Thrift帮不了你多少忙,因为a)没有Thrift XML协议,b)没有“the”XML格式——XML基本上只描述有效XML文档的语法,而不是具体XML实例中的语法。后者是高度可变的,通常根据DTD或XML模式定义。尽管XML模式或DTD与节俭IDL之间有一些相似之处,但它们并没有任何共同之处

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

  • 一旦您读取了足够的数据并将其转换为节约对象,就可以使用
    TBinarySerializer
    类并调用
    serialize()
    方法,如
    $buffer=$serializer.serialize($object)
    。返回的
    $buffer
    包含以二进制格式序列化的数据

  • TBinarySerializer
    类可以在
    /lib/php/src/lib/Thrift/Serializer
    下找到,谢谢

    对于其他未来读者:

    好吧,我花了很多时间去做,我成功了

    $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);
    
    它起作用了

    $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做这个

    然后,我可能会用拼花地板的形式。。。(与Cloudera Impala一起使用) 我将XML文件转换为旧文件以将其存储到HDF中。 直接使用thrift是不可能的,有很多旧的XML文件需要转换


    这是如此的酷,即使我已经通过了很多天来理解

    好的,我有很多xml文件。我想可持续地储存它们。(具有结构验证和适应变化的能力)。我不知道怎么做,但我想使用节俭,因为我可以使用一些Hadoop组件(HDFS和Impala)。之后,为什么不使用拼花地板呢。。然后,XML文件->对象->节俭对象->二进制文件。很抱歉,我什么都不懂。如果你有任何关于apache thrift的文档,使用PHP语言,只使用序列化器/反序列化器,我就是接受者!