Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Zend_Amf, AMFPHP и т.д.: сериализация в Vector.<T>? (http://www.flasher.ru/forum/showthread.php?t=169538)

trng 06.10.2011 23:39

Zend_Amf, AMFPHP и т.д.: сериализация в Vector.<T>?
 
Уважаемый wvxvw озвучил:
Цитата:

"Vector.<T> появился после того, как был написан AMF3.0 формат, и по-этому пока-что не используется в сериализации"
(http://www.flasher.ru/forum/showpost...10&postcount=5)

Правильно ли я понимаю:
За прошедший месяц ситуация не поменялась и на сегодняшний день ни один из amf-серверов не сериализует (нормально не сериализует) вектора.

Может, все таки уже есть сдвиги в лучшую сторону?
Сильно надо.

Dimitry_II 07.10.2011 10:50

А вектор, случаем, не устаревший интерфейс?

Genzo 07.10.2011 11:03

Наоборот обновленный , как на хабре написано http://habrahabr.ru/blogs/Flash_Platform/122178/ . если есть желание можете сами реализовать десереализатор

trng 07.10.2011 12:42

Цитата:

Сообщение от Genzo (Сообщение 1037589)
Наоборот обновленный , как на хабре написано http://habrahabr.ru/blogs/Flash_Platform/122178/ . если есть желание можете сами реализовать десереализатор

Читаем по ссылке:

Цитата:

В итоге патч для Zend_Amf так и не был написан ... найдётся много желающих, готовых реализовать поддержку векторов в Zend_Amf, AMFPHP, WebORB, PyAMF и остальных.
Получается, что НИ ОДИН из amf-серверов таки не поддерживает векторы. На сегодня.

Genzo 07.10.2011 12:47

Читаем выше :
Цитата:

если есть желание можете сами реализовать десереализатор
Добавлено через 34 секунды
Спецификация дана , написать не сложно

trng 07.10.2011 14:08

А вот как раз со спецификацией есть нюансы. А именно с длинной вектора, которая вроде как должна быть U29.
Пишем вот такой нехитрый код (Vector.<uint> - для примера):
Код AS3:

function traceHex(data:Vector.<uint>):void {
        var ba:ByteArray = new ByteArray();
        ba.writeObject(data);
        var s:String = data.length.toString() + ' : ';
 
        // чисто оформительское обрезание:
        // признак вектора  (1 байт) + длина (макс. 4 байта) + U8 + данные (одно uint 4 байта) = 10
        var j:int = (ba.length > 10) ? 10 : ba.length;
 
        for (var i:int=0;i<j;i++) {
                if (ba[i] < 0x10) s += '0';
                s +=  ba[i].toString(16).toUpperCase() + ' ';
        }
        trace (s);
}
 
var la:Array = new Array(1, 2, 0x10, 0xff, 0xffff, 0xffffff);
var bh:Vector.<uint>;
 
 
bh = new Vector.<uint>(0);
traceHex( bh );
 
 
for (var i:int=0;i<la.length;i++) {
  bh = new Vector.<uint>(la[i]);
  bh[0] = 0x90807060; // чтобы было видно начало вектора
  traceHex( bh );
}

Получаем:


Код:


        0 : 0E 01 00
        1 : 0E 03 00 90 80 70 60
        2 : 0E 05 00 90 80 70 60 00 00 00
      16 : 0E 21 00 90 80 70 60 00 00 00
      255 : 0E 83 7F 00 90 80 70 60 00 00
    65535 : 0E 87 FF 7F 00 90 80 70 60 00
 16777215 : 0E 87 FF FF FF 00 90 80 70 60

Итак:
  1. 0E - (1 байт) маркер вектора uint. Правильно.
  2. длина вектора (U29) - как то на UINT29 не похоже
  3. 00 - (U8) vector-fixed-flag - правильно
  4. первый элемент вектора (uint - 4 байта) - правильно

По поводу длины вектора. Читаем спецификацию U29:
  • 0x00000000 - 0x0000007F : 0xxxxxxx
  • 0x00000080 - 0x00003FFF : 1xxxxxxx 0xxxxxxx
  • 0x00004000 - 0x001FFFFF : 1xxxxxxx 1xxxxxxx 0xxxxxxx
  • 0x00200000 - 0x3FFFFFFF : 1xxxxxxx 1xxxxxxx 1xxxxxxx xxxxxxxx
  • 0x40000000 - 0xFFFFFFFF : throw range exception

Получается что 0 должен быть 0, 1 должно быть 1, 2 должно быть 2
Имеем:
вместо нуля - 1
вместо 1 - 3
вместо 2 - 5.


Допустим, что спецификацию U29 надо понимать так, как написано в комменте на хабре:
; The first (low) bit is a flag with value 1.
; The remaining 1 to 28 significant bits are used to encode
; the length of the vector
Тогда получается, что 0, 1, 2, 16 - правильно.
А все что больше - неправильно.
Наприрмер для 255 (0xff): как ни крути 837F - 8 единиц подряд (0xff) не получается. Получается либо больше либо меньше.

Добавлено через 7 минут
0x83: 10000011
0x7f : 01111111
Как из этого получить 8 единиц?

Добавлено через 1 час 44 минуты
Ошибочка вышла. Работает.
Если взять readUInt29() из http://cvlib.googlecode.com/svn-hist...or/amf/AMF3.as и результат сдвинуть вправо на один бит, то работет.


Часовой пояс GMT +4, время: 07:10.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.