Не так давно (год назад), google предложил всем желающим использовать язык Protocol Buffers
Почитал, посмотрел — забавно. Перспективы использования большие.
есть порты на AS3, я тестировал этот:http://code.google.com/p/protobuf-actionscript3/
Хочу использовать как замену AMF.
В тестовом примере имитирую передачу данных по бинарному сокету.
Сразу появились проблемы: В том виде, как это сделано сейчас нормально можно работать только по схеме запрос/ответ, т.е. когда знаешь какой класс должен прийти в ответ.
При работе с «безымянным» сокетом в AMF можно узнать что за класс тебе пришел.
Попробуем реализовать это в ProtoBuf:
Все исходники тестового примера во вложении, здесь я акцентирую внимание, только на мои доделки)
итак главный класс: Main.as (читаем комменты)
Код AS3:
Затем в хэндлере onData (Main.as) вначале читаем имя псевдонима, создаем класс по этому псевдониму и в нём уже, читаем остальные данные
Код AS3:
Почитал, посмотрел — забавно. Перспективы использования большие.
есть порты на AS3, я тестировал этот:http://code.google.com/p/protobuf-actionscript3/
Хочу использовать как замену AMF.
В тестовом примере имитирую передачу данных по бинарному сокету.
Сразу появились проблемы: В том виде, как это сделано сейчас нормально можно работать только по схеме запрос/ответ, т.е. когда знаешь какой класс должен прийти в ответ.
При работе с «безымянным» сокетом в AMF можно узнать что за класс тебе пришел.
Попробуем реализовать это в ProtoBuf:
Все исходники тестового примера во вложении, здесь я акцентирую внимание, только на мои доделки)
итак главный класс: Main.as (читаем комменты)
Код AS3:
- package
- {
- import com.google.protobuf.Message;
- import com.google.protobuf.Person;
- import com.google.protobuf.PhoneNumber;
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.net.getClassByAlias;
- import flash.net.registerClassAlias;
- import flash.utils.ByteArray;
- import flash.utils.getDefinitionByName;
- import flash.utils.getQualifiedClassName;
- /**
- * Тестовый класс работы с protoBuf - изменены исходники класса парсера
- * @author k0t0vich
- */
- public class Main extends Sprite
- {
- public function Main():void
- {
- if (stage) init();
- else addEventListener(Event.ADDED_TO_STAGE, init);
- }
- private function init(e:Event = null):void
- {
- removeEventListener(Event.ADDED_TO_STAGE, init);
- // entry point
- //Регистрируем псевдонимы классов
- registerClassAlias(«py.Person», Person);
- registerClassAlias(«py.Number», PhoneNumber);
- // Создание и шифровка класса.--------------------------
- //write
- var person:Person = new Person();
- person.alias = «py.Person»;
- person.setName(«John Doe»);
- person.setId(1234);
- person.setEmail(«jdoe@example.com»);
- var number:PhoneNumber = new PhoneNumber();
- var number2:PhoneNumber = new PhoneNumber();
- number.setNumber(«555-6789»);
- person.addPhone(number);
- number2.setNumber(«123123123-12312»);
- person.addPhone(number2);
- trace(«person: »+person);
- //Write it out to a any IDataOutput
- var bytes:ByteArray = new ByteArray();
- person.writeToDataOutput(bytes);
- trace(«writed bytes: » + bytes);
- //-------------------------------------------------------
- // имитация прихода данных от сокета
- onData(bytes);
- }
- //Данные от
- private function onData(bytes:ByteArray):void
- {
- bytes.position = 0;
- //read
- var message:Message = new Message();
- //читаем не всё сообщение, а только имя псевдонима
- var alias:String = message.readClassAliasFromDataOutput(bytes);
- var classRef:Class = getClassByAlias(alias) as Class;
- var item:* = new classRef();
- bytes.position = 0;
- item.readFromDataOutput(bytes);
- // выполняем метод конкретного класса
- item.changeModel();
- }
- }
- }
Затем в хэндлере onData (Main.as) вначале читаем имя псевдонима, создаем класс по этому псевдониму и в нём уже, читаем остальные данные
Код AS3:
- private function onData(bytes:ByteArray):void
- {
- bytes.position = 0;
- //read
- var message:Message = new Message();
- //читаем не всё сообщение, а только имя псевдонима
- var alias:String = message.readClassAliasFromDataOutput(bytes);
- var classRef:Class = getClassByAlias(alias) as Class;
- var item:* = new classRef();
- bytes.position = 0;
- item.readFromDataOutput(bytes);
- // выполняем метод конкретного класса
- item.changeModel();
- }