InfomaniacAMF 是一个用于 AMF 数据包的 (反)序列化 PHP 项目

0.7.0 2014-03-22 10:27 UTC

This package is not auto-updated.

Last update: 2024-09-28 15:28:56 UTC


README

Build Status Scrutinizer Code Quality

简介

AMF (Action Message Format) 是一种二进制数据序列化协议。简单来说,它将内存中的对象转换为二进制字符串,并且可以将这个二进制字符串转换回内存中的对象。它可以像 JSON 一样使用,并且这个库旨在提供与 PHPJSON 功能类似的 API。

用途

该库的目的是在 PHPJSON 中提供对 AMF 规范的一致且对称的实现。

为什么使用 AMF?

这取决于你。 JSON 完全适合于网络,但它确实有一些由 AMF 解决的缺点。首先,JSON 无法处理具有循环引用的复杂对象图;此外,它无法序列化日期和字节数组 - 你需要在 JSON 中进行一些额外的工作来支持这些(将日期转换为 Unix 时间戳,将字节数组转换为 base64)。

我应该停止使用 JSON 吗?

当然不。 JSON 很好;AMF 可以为你提供一些额外的功能,这些功能可以帮助你构建你的 Web 应用程序。

入门

要开始使用此库,您需要通过 Composer 安装它

{
	"require": {
		"infomaniac-amf/php": "dev-master"
	}
}

一旦您运行了 composer install,您就可以通过包含 Composer 的自动加载器来使用库

<?php
require_once 'vendor/autoload.php';

用法

以下是将数组编码为 AMF 的简单示例

<?php
require_once 'vendor/autoload.php';

$data = array(
	'any' => 'data',
	'you' => 'like'
);

header('Content-Type: application/x-amf');
echo amf_encode($data);

这将产生一个表示您提供的数据的二进制字符串。

如果您使用工具(如 Charles Proxy)检查生成 AMF 数据的页面的 HTTP 流量,您将看到以下输出

要解码此字符串,只需执行以下操作

$data = array(
	'any' => 'data',
	'you' => 'like'
);

$encodedData = amf_encode($data);
$data = amf_decode($encodedData);

如果您使用 var_dump 检查此数据,它将看起来与提供给 amf_encode 函数的输入数据完全相同。

array (size=2)
  'any' => string 'data' (length=4)
  'you' => string 'like' (length=4)

额外功能

类映射

AMF 允许您编码一个对象并保留一些关于它的元数据;例如,在序列化类的实例(不是 stdClass)时,库将保留类的完全限定命名空间名称,并在解码时使用它来重建该类型的对象。

考虑以下类

<?php

class Person {
	public $name;
}

如果我们编码此对象的实例,默认情况下,它的类类型将被忽略,并且在解码数据时,结果值将是一个普通的 PHP stdClass 实例。

这是在 Charles 中编码数据的模样

为了在 AMF 中保留类类型,您需要在 amf_encode 函数调用中添加一个额外的标志

amf_encode($data, AMF_CLASS_MAPPING);

当提供 AMF_CLASS_MAPPING 标志时,编码数据在 Charles 中的外观将如下所示

注意此响应中添加的 Person 元数据

现在,当此数据被解码时,库将尝试创建一个新的 Person 类实例,并将其公共属性 name 设置为 "bob"

object(Person)[8]
  public 'name' => string 'bob' (length=3)

数据编码(序列化)

AMF 规范允许序列化多种不同的数据类型。

以下是最新的规范链接: AMF3 Spec - January 2013

这个库实现了规范中描述的 10 种数据类型中的 18 种。只支持这些类型的子集的原因可以从两个方面来理解:实用性局限性。以下是可用的数据类型的详尽列表:

许可证

本项目采用 MIT 许可证授权。

致谢

在编写这个库的过程中,我使用了几个库来验证我的进度,并帮助我解决问题。我想特别感谢以下库和个人