我有一个很好的答案,一个不好的答案,然后解决您的问题的答案。
很好的回答
如果我可以把这个地方是个完全:你可能真的不希望这样做的。你提到类名有时比实际数据更长。如果是这种情况,那么总体而言,序列化中几乎没有数据。除非你有一些可笑的长命名空间/类名(在这种情况下,你可能想重新考虑你的应用程序结构),我想你的序列化字符串将很容易适合,例如,MySQL文本字段。重点是,如果你只有一点点的数据,我真的怀疑用一种标准格式来削减少于一千字节的数据是值得的。任何合理的数据库和服务器都将能够毫无问题地处理这些事情,即使您拥有数百万和数百万个这样的记录。所以除非这是一种低内存的嵌入式设备,否则我会很好奇听到你为什么认为你需要这样做(当然这是修辞:我认真地怀疑你是在嵌入式设备上运行PHP)。
如果做尝试做这样的事情,你要补充一点,你将不得不保持每个人都会看着你,并说码“什么在世界上是怎么回事? ”。它取决于你的需要,但我怀疑你更可能通过代码来引入问题,这将使这个功能发生,而不是简单地让你的序列化数据变长。
不好回答
我真的不认为你想将序列数据的任何变化。要直接回答你的问题之一:不,没有办法缩短命名空间,仍然使用PHP的unserialize()
方法,除非在应用程序中完全抛弃命名空间。我真的怀疑你想这样做。
您的其他选择是手动调整序列化的字符串。然后你可以存储这个“修改的序列化格式”(我们称之为)。然后,当你需要反序列化时,你必须扭转你的modSerialized函数,并且可以正常运行unserialize()
。这样做的麻烦在于PHP的serialize
方法的输出代表了一种标准的并且完善的编码。修改它本来就是容易出错的,根据定义,它将违背标准的最佳实践。如果你非常小心并且写了很多代码,你可以毫无问题地做到这一点,我认为你不想这么做。例如,你可以想象找到并替换\Namespace1\Subnamespace\dataobjectA
与胡言乱语,因为你想确保你不会意外地用你的字符串中实际发现的东西替换它。然后你必须记住你输入的是什么样的乱码,以及它代表什么,所以你可以稍后改变它。如果你成功地做到了这一点,那么新的!你只是重新发明了车轮,并建立了一个专门的压缩算法!
真的,你也不想这样做。或者如果你这样做,只需要@Blackbam给出的答案,并用正常的压缩算法压缩你的数据。这将不太奇怪。
另一个选项
最后,如果你不喜欢任何的上述建议,然后还有一个:沟PHP serialize()
一起。显然它不适合你的需求。因此,最好提出一个非常适合您的需求的解决方案,然后尝试修改完善的标准以适应您的问题。沿着这条路线将会给你一个不适合任何人的嵌合体。
这是什么样子?这取决于你的问题。例如,您可以在系统中为类名建立一些缩写。然后,当需要序列化时,可以创建一个包含缩写类名的数组,以及需要保持的对象数据的字符串表示形式,以便重建它。然后找到一些编码:它可能只是JSON,甚至PHP的序列化,或其他格式。然后,手动构建自己的unserialize()
方法,以从您自己的序列化表示中重建对象。基本上,制作你自己的serialize()
和unserialize()
。
@PeterFeatherstone不会让它变长吗? – Goose
您可以在序列化时修剪名称空间/子名称空间,然后在反序列化之前重新添加它,但我想这会是某种“WTF是这样的***?!“,并且会阻止你的数据被其他服务/软件轻易使用。 – NaeiKinDus
是的,但是如何做到这一点?睡眠或Serializable接口不会影响类名称.... –