【问题标题】:Very compact object serialization method非常紧凑的对象序列化方法
【发布时间】:2010-08-20 12:20:27
【问题描述】:

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

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

【问题讨论】:

    标签: actionscript-3 json networking serialization


    【解决方案1】:

    你可以试试这个。使用您现有的某种方法(JSON、XML 等)将您的对象序列化为字符串;然后将字符串写入 ByteArray 和 compress 它。 Base64 对压缩的字节数组进行编码,因此您可以将其作为文本传递。

    其他选项可能是使用 Flash 原生序列化格式 (AMF)。这也可以使用 ByteArray 来完成,使用方法 writeObjectreadObject。 (如果您想保留类型信息,您应该提前致电registerClassAlias)。将数据序列化为 AMF 后,base64 对字节数组进行编码并将其作为文本传递。不确定压缩它是否有意义;很可能不会,因为 AMF 已经被压缩了,但是您可以尝试压缩和未压缩,看看是否有显着差异。

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

    【讨论】:

    • 我现在正在尝试类似的方法,使用 ByteArray.toString() 来获取字符串版本,但我坚持将字符串转回字节数组
    【解决方案2】:

    使用您自己的数据包结构创建序列化/反序列化方法。现在你的模型上可能有 fromXML() 和 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();
    
        }
    }
    

    我假设您正在创建要更新的项目的大列表——您可能还希望只发送更改项目的数据。一旦你创建了你的主字节数组,你可以在那个时候压缩它,然后把它发送过来......

    【讨论】:

    • 喂。这种方法可以工作,但维护和扩展是一种痛苦。如果您想发送许多这些对象(和/或不同类型的对象),您基本上将定义自己的自定义二进制格式。我认为使用几乎可以免费使用的已经存在的 (AMF) 是一个更好的选择。
    • 他说他希望它非常紧凑:)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-12-09
      • 2010-10-07
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      相关资源
      最近更新 更多