非常紧凑的对象序列化方法

时间:2010-08-20 12:20:28

标签: actionscript-3 json networking serialization

我正在Flash中构建一个实时动作多人游戏,它使用太多带宽,因为它将消息对象作为XML发送(根据Smartfox服务器的要求)。我现在正试图通过将对象序列化为字符串来减少它,然后再将它们提供给Smartfox。

我尝试过JSON,但它没有多大帮助。是否有另一个更紧密的序列化方法,例如,编码Base64中的数字而不是小数?在这种情况下,我不关心人类的可读性。

3 个答案:

答案 0 :(得分:2)

你可以尝试一下。使用您使用的某些方法(JSON,XML等)将对象序列化为字符串;然后将字符串写入ByteArray并compress。 Base64对压缩的bytearray进行编码,以便您可以将其作为文本传递。

其他选项可能是使用Flash本机序列化格式(AMF)。使用方法writeObjectreadObject也可以使用ByteArray完成此操作。 (如果要保留类型信息,则应先调用registerClassAlias。将数据序列化为AMF后,base64会对bytearray进行编码并将其作为文本传递。不确定压缩它是否有意义;很可能不是,因为AMF已经被压缩了,但你可以尝试压缩和未压缩,看看是否存在显着差异。

此外,根据您的数据,您可以手工制作一些在一般情况下无法应用的特殊压缩方案,但这将涉及更多,并且不会产生最佳结果。我觉得AMF会是一个更好的选择。

答案 1 :(得分:0)

使用您自己的数据包结构创建序列化/反序列化方法。现在您可能在模型上使用了XML()和toXML()方法 - 现在只需添加serialize()和deserialize()或toByteArray()或fromByteArray()。这将大大减少你的尺寸,但是,会有更多的代码 - 例如:

public class Ship {

    public var x:Number;
    public var y:Number;

    public function toByteArray() {
        var bytes:ByteArray = new ByteArray();

        // packet length
        // 4 bytes: length of entire packet
        // 4 bytes: x float value
        // 4 bytes: y float value
        bytes.writeUnsignedInt(12);
        bytes.writeFloat(x);
        bytes.writeFloat(y);
    }

    public function fromByteArray(bytes:ByteArray) {

        // we already know the size of our packet, so go ahead and don't read the length
        var length:int  = bytes.readUnsignedInt();

        // read the x/y
        x       = bytes.readFloat();
        y       = bytes.readFloat();

    }
}

我假设您正在创建要更新的项目的大列表 - 您可能还希望仅发送更改项目的数据。一旦你创建了主bytearray,你可以在那时压缩它,然后发送它...

答案 2 :(得分:0)

您可以使用Protobuf吗?通过protobuf序列化对象,然后发送二进制数据。