我正在Flash中构建一个实时动作多人游戏,它使用太多带宽,因为它将消息对象作为XML发送(根据Smartfox服务器的要求)。我现在正试图通过将对象序列化为字符串来减少它,然后再将它们提供给Smartfox。
我尝试过JSON,但它没有多大帮助。是否有另一个更紧密的序列化方法,例如,编码Base64中的数字而不是小数?在这种情况下,我不关心人类的可读性。
答案 0 :(得分:2)
你可以尝试一下。使用您使用的某些方法(JSON,XML等)将对象序列化为字符串;然后将字符串写入ByteArray并compress。 Base64对压缩的bytearray进行编码,以便您可以将其作为文本传递。
其他选项可能是使用Flash本机序列化格式(AMF)。使用方法writeObject和readObject也可以使用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序列化对象,然后发送二进制数据。