Очень компактный метод сериализации объектов - PullRequest
1 голос
/ 20 августа 2010

Я создаю многопользовательскую игру в реальном времени во Flash, которая использует слишком большую пропускную способность, потому что она отправляет объекты сообщений в виде XML (как того требует сервер Smartfox).Сейчас я пытаюсь сократить это, сериализовав свои объекты в строки перед передачей их в Smartfox.

Я пробовал JSON, но это мало помогает.Есть ли другой метод сериализации, который является компактным, например, который кодирует числа в Base64 вместо десятичных?В данном случае мне плевать на читабельность.

Ответы [ 3 ]

2 голосов
/ 20 августа 2010

Вы можете попробовать.Сериализуйте ваши объекты в строку, используя какой-то метод, который у вас есть (JSON, XML и т. Д.);затем записать строку в ByteArray и сжимать it.Base64 кодирует сжатый байтовый массив, чтобы вы могли передать его в виде текста.

Другой вариант может заключаться в использовании собственного формата сериализации Flash (AMF).Это также можно сделать с помощью ByteArray, используя методы writeObject и readObject .(Вы должны вызвать registerClassAlias ​​ ранее, если вы хотите сохранить информацию о типе).После сериализации данных в AMF base64 кодирует байтовый массив и передает его в виде текста.Не уверен, имеет ли смысл его сжимать;скорее всего, нет, поскольку AMF уже сжат, но вы можете попробовать как сжатый, так и несжатый и посмотреть, есть ли существенная разница.

Кроме того, в зависимости от ваших данных, вы можете вручную создать некую схему сжатия adhoc,не может быть применен в общем случае, но это будет более сложным и не обязательно даст лучшие результаты.У меня есть ощущение, что AMF будет лучшим вариантом.

0 голосов
/ 16 октября 2012

Можете ли вы использовать Protobuf ?Сериализуйте ваши объекты через protobuf, а затем отправьте двоичные данные.

0 голосов
/ 21 августа 2010

Создайте метод сериализации / десериализации с вашей собственной структурой пакетов. Прямо сейчас у вас, вероятно, есть методы 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();

    }
}

Я предполагаю, что вы создаете большие списки элементов для обновления - вы также можете отправлять данные только для элементов, которые меняются. После того, как вы создали свой основной bytearray, вы можете сжать его в этот момент, а затем отправить его через ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...