2017-07-25 40 views
2

我有一组我需要序列化对象,但类名是长,例如:有没有一种简单的PHP方法来最小化序列化中的类名?

"\Namespace1\Subnamespace\dataobjectA" 
"\Namespace1\Subnamespace\dataobjectB" 
"\Namespace1\Subnamespace\dataobjectC" 
"\Namespace1\Subnamespace\dataobjectD" 

使用上的对象序列化功能,我得到: “○:41:\” Namespace1 \ Subnamespace \ dataobjectC \“:1:{s:4:”data“; s:9:”some data“;}”

序列化字符串包含有时比数据更大的完整类名:)

  • 我已经熟悉__sleep() ans __wakeup()函数,在这里没用。

  • 我明白,查找表的一些国王需要

我的问题是: 有一个简单的PHP的方式,以尽量减少序列化的类名

任何建议,欢迎

+1

@PeterFeatherstone不会让它变长吗? – Goose

+0

您可以在序列化时修剪名称空间/子名称空间,然后在反序列化之前重新添加它,但我想这会是某种“WTF是这样的***?!“,并且会阻止你的数据被其他服务/软件轻易使用。 – NaeiKinDus

+0

是的,但是如何做到这一点?睡眠或Serializable接口不会影响类名称.... –

回答

2

我有一个很好的答案,一个不好的答案,然后解决您的问题的答案。

很好的回答

如果我可以把这个地方是个完全:你可能真的不希望这样做的。你提到类名有时比实际数据更长。如果是这种情况,那么总体而言,序列化中几乎没有数据。除非你有一些可笑的长命名空间/类名(在这种情况下,你可能想重新考虑你的应用程序结构),我想你的序列化字符串将很容易适合,例如,MySQL文本字段。重点是,如果你只有一点点的数据,我真的怀疑用一种标准格式来削减少于一千字节的数据是值得的。任何合理的数据库和服务器都将能够毫无问题地处理这些事情,即使您拥有数百万和数百万个这样的记录。所以除非这是一种低内存的嵌入式设备,否则我会很好奇听到你为什么认为你需要这样做(当然这是修辞:我认真地怀疑你是在嵌入式设备上运行PHP)。

如果尝试做这样的事情,你要补充一点,你将不得不保持每个人都会看着你,并说码“什么在世界上是怎么回事? ”。它取决于你的需要,但我怀疑你更可能通过代码来引入问题,这将使这个功能发生,而不是简单地让你的序列化数据变长。

不好回答

我真的不认为你想将序列数据的任何变化。要直接回答你的问题之一:不,没有办法缩短命名空间,仍然使用PHP的unserialize()方法,除非在应用程序中完全抛弃命名空间。我真的怀疑你想这样做。

您的其他选择是手动调整序列化的字符串。然后你可以存储这个“修改的序列化格式”(我们称之为​​)。然后,当你需要反序列化时,你必须扭转你的modSerialized函数,并且可以正常运行unserialize()。这样做的麻烦在于PHP的serialize方法的输出代表了一种标准的并且完善的编码。修改它本来就是容易出错的,根据定义,它将违背标准的最佳实践。如果你非常小心并且写了很多代码,你可以毫无问题地做到这一点,我认为你不想这么做。例如,你可以想象找到并替换\Namespace1\Subnamespace\dataobjectA与胡言乱语,因为你想确保你不会意外地用你的字符串中实际发现的东西替换它。然后你必须记住你输入的是什么样的乱码,以及它代表什么,所以你可以稍后改变它。如果你成功地做到了这一点,那么新的!你只是重新发明了车轮,并建立了一个专门的压缩算法!

真的,你也不想这样做。或者如果你这样做,只需要@Blackbam给出的答案,并用正常的压缩算法压缩你的数据。这将不太奇怪。

另一个选项

最后,如果你不喜欢任何的上述建议,然后还有一个:沟PHP serialize()一起。显然它不适合你的需求。因此,最好提出一个非常适合您的需求的解决方案,然后尝试修改完善的标准以适应您的问题。沿着这条路线将会给你一个不适合任何人的嵌合体。

这是什么样子?这取决于你的问题。例如,您可以在系统中为类名建立一些缩写。然后,当需要序列化时,可以创建一个包含缩写类名的数组,以及需要保持的对象数据的字符串表示形式,以便重建它。然后找到一些编码:它可能只是JSON,甚至PHP的序列化,或其他格式。然后,手动构建自己的unserialize()方法,以从您自己的序列化表示中重建对象。基本上,制作你自己的serialize()unserialize()

4

如果您担心数据的长度,可以使用一些良好的压缩功能对其进行压缩。

这是一个工作示例:

class Tester { 
    public $name; 
    public $age; 
} 

$a = new Tester(); 

$a->name = "Harald the old Capttttttttttttain    is going to live very long."; 
$a->age = 999999999; 

$ser = serialize($a); 
var_dump($ser); 

$comp = gzcompress($ser,9); 

var_dump($comp); 

结果:

串(133) “O:6:” 测试 “:2:{S:4:” 姓名“; S :75: “哈拉尔老 Capttttttttttttain是要活得很长 ”; S:3: “年龄”;我:999999999;} “

串(108)” X2R 我-.IR2.2RKMU.27RH,JIQ(HU %H 13Od +克++ d ù끌4RJLieֵҺ(”

当然后者的是不人类可读再也不会在数据库搜索中使用,但它更短。

PHP bzcompress有不同的压缩机制(http://php.net/manual/en/function.bzcompress.php)可能比gzcompress更好。

+0

我不认为这会解决问题。'gzcompress'使用DEFLATE算法。该算法通过删除重复项来减少空间使用量。命名空间在数据集中可能是独一无二的,因此它之后不会更短。 –

+0

@MarvinRabe这就是为什么我写了可能需要一个其他压缩算法。即使是自定义压缩算法也可能适用。 – Blackbam

相关问题