Protobuf + AS3

Posted on: July 5th, 2011 by Heart 2 Comments »

Google protocol buffers – альтернатива AMF

Почитать о том, что такое буферы протоколов можно тут. Кому после прочтения яснее не стало, опишу вкратце. На практике это выглядит следующим образом: есть задача, которая предполагает передачу данных между клиентом и сервером, например через бинарный сокет. Все поля, необходимые для описания этих данных, описываются в специальном формате. После этого файл “отдается” компилятору protobuf. На выходе получаем классы для указанного при компиляции языка программирования. В коде, классы используются для создания объекта. Поля объекта инициализируются нужными данными и передаются через сокет.

Теперь подробнее

Допустим нам нужно передать следующую структуру данных, состоящую из нескольких полей:

  • command – integer
  • status – integer
  • serviceMessage – integer
  • par – array

Поле command – обязательно для заполнения, поля status и serviceMessage могут буть не заполнены, массив par может содержать сколько угодно элементов. Все это нужно написать так, чтобы можно было “скормить” protobuf-у. Создаем файл message.proto и туда пишем следующее:

 

message Param {
 
    optional string name = 1;
    optional string value = 2;
}
 
message ProtoMessage {
 
    required int32 command = 1;
    optional int32 status = 2;
    optional int32 serviceMessage = 3;
 
    repeated Param par = 4;
}

Обратите внимание на ключевые слова: required, optional, repeated. Детальнее здесь. Теперь нужно что-то, чему мы будем это “скармливать”. Закачать это можно здесь. Тут мы увидим список архивов различных версий. Можно скачать исходники и скомпилировать их, например при помощи компилятора C++, а можно не “выделываться” и скачать Windows binary (например protoc-2.3.0-win32.zip), что я и сделал.

Внутри архива мы обнаружим protoc.exe. Для того, чтобы сгенерировать классы ActionScript, необходимо использовать так же protoc-gen-as3-plugin (protoc-gen-as3-0.9.1-bin.tar.gz) в связке с protoc.exe. Распаковываем архив в туже папку где лежит protoc.exe. Запускаем командную строку из каталога, в котором находятся нужные нам файлы, пишем в ней следующее:

 

protoc --plugin=protoc-gen-as3=protoc-gen-as3.bat --as3_out=c:\ message.proto

После запуска, на диске C:\ можно наблюдать два файла: Param.as и ProtoMessage.as. Эти файлы можно подключать к своему проекту и использовать.

Использование в проекте

В зависимости от структуры проекта, пакеты в полученных файлах нужно будет подправить, т.к. файлы создаются в пакете по умолчанию. Для работы сгенерированных классов, к проекту нужно подключить protobuf.swc, который находился в protoc-gen-as3-0.9.1-bin.tar.gz. После того, как к проекту подключены все необходимые файлы, можно создавать объекты ProtoMessage.

 

var message:ProtoMessage = new ProtoMessage();
 
message.command = 1;
 
message.par = new Array();
 
var buf:Param = new Param();
 
buf.name = 'name';
buf.value = 'value';
 
message.par.push(buf);

Теперь этот объект можно передавать через сокет. Предположим, что сокет создан и настроен на передачу данных. Чтобы передать protobuf-объект, нужно сделать следующее:

 

try {
 
    var bytes:ByteArray = new ByteArray();
 
    message.writeExternal(bytes);
 
    socket.writeBytes(bytes);
    socket.writeMultiByte('\n', 'UTF-8');
 
} catch(e:Error) {
 
}
 
socket.flush();

В завершение, необходимо отметить, что описанный выше способ создания классов protobuf для AS3 не единственный. Есть также еще вот этот проект, который можно использовать для этих целей.

2 Responses

  1. koldoon says:

    Хотелось бы еще пример, как потом получить и десериализовать подобный объект.

Leave a Reply