ByteArray — чрезвычайно мощный класс, который может использоваться для многих вещей, связанных с манипулированием данными, включая (но не ограничиваясь) сохранение игровых данных в сети, шифрование данных, сжатие данных и преобразование объекта BitmapData в файл PNG или JPG. В этом введении мы будем использовать класс ByteArray, чтобы взять собственный объект AS3 и закодировать его в строку, которую можно сохранить на сервере для последующего восстановления, а затем декодировать позже.
В предыдущих уроках мы видели, как использовать XML и JSON для кодирования данных в текстовом (строковом) формате. Тем не менее, и XML, и JSON разработаны для удобства чтения, и в результате они намного длиннее, чем нужно. Также может быть сложно преобразовать определенные типы объектов AS3 в любой формат. ByteArray имеет несколько действительно продвинутых функций, но для начала мы рассмотрим один простой: он позволяет легко превратить объект AS3 в строку.
Окончательный результат предварительного просмотра
Давайте посмотрим на конечный результат, к которому мы будем стремиться:
Когда вы вставляете закодированную строку ByteArray в TextField и нажимаете кнопку «Загрузить», она расшифровывает ее и показывает сохраненные в ней свойства объекта. Вы можете попробовать следующие закодированные ByteArrays; скопируйте их в TextField и нажмите кнопку «Загрузить», чтобы увидеть, о чем я говорю:
|
1
2
|
//This ByteArray will show my data (This is the default ByteArray loaded)
CgsBFW9jY3VwYXRpb24GB0NUTw93ZWJzaXRlBiFodHRwOi8vaWt0LmNvLmlkCW5hbWUGDVRhdWZpawE=
|
|
1
2
|
//This ByteArray will show my current thought
CgsBIWZvb2RfZm9yX3Rob3VnaHQGgnVJIGFtIHRoaW5raW5nIG9uIHNoYXJpbmcgdGhlIHRlY2huaXF1ZSBpIHVzZWQgdG8gbWFrZSBhIEZ1bGwgRmxhc2ggRHluYW1pYyBXZWJzaXRlIFNFTyBGcmllbmRseSBmb3IgbXkgbmV4dCBUdXRvcmlhbCBpbiBBY3RpdmVUdXRzKy4uLiA8dT5XaGF0IGRvIHlvdSB0aGluaz88L3U+IDxiPmlzIGl0IGEgZ29vZCBpZGVhPC9iPj8B
|
|
1
2
|
//This ByteArray will talk about Flash and SEO and my experience with them
CgsBEXF1ZXN0aW9uBoEDPGI+PHU+Q2FuIGEgZnVsbHkgZHluYW1pYyBGbGFzaCBXZWJzaXRlIGJlIFNFTyBmcmllbmRseTwvdT48L2I+Pz8NYW5zd2VyBoM/SXQgY2FuLCBoZXJlIGlzIHRoZSBwcm9vZiwgPGEgaHJlZj0naHR0cDovL3d3dy5nb29nbGUuY28uaWQvc2VhcmNoP3E9Zmxhc2grc2VvJmllPXV0Zi04Jm9lPXV0Zi04JmFxPXQnIHRhcmdldD0nX2JsYW5rJz5odHRwOi8vd3d3Lmdvb2dsZS5jby5pZC9zZWFyY2g/cT1mbGFzaCtzZW8maWU9dXRmLTgmb2U9dXRmLTgmYXE9dDwvYT4sIGlrdC5jby5pZCBpcyByYW5rZWQgIzYgb3ZlciB0aGVyZQE=
|
Шаг 1. Создание нового проекта ActionScript

В окне «Flash Builder»:
- Откройте Flash Builder 4
- Нажмите меню файлов
- Наведите на новый
- Нажмите ActionScript Project
Шаг 2: Новая настройка ActonScript Project

В окне «Новый проект ActionScript»:
- Введите ‘TUTORIAL_ByteArray’ в поле Имя проекта
- Пожалуйста, помните, где вы сохранили свой проект
- Нажмите кнопку «Готово»
Шаг 3: Base64.as
Скопируйте Base64.as в каталог вашего проекта com.

- Создайте новый каталог ‘com’ внутри вашего исходного каталога.
- Загрузите файл Base64.as из исходной загрузки.
- Поместите файл во вновь созданный каталог ‘com’.
Base64.as пригодится позже. Это Стив Вебстер, который жил на сайте dynamicflash.com (он покинул сообщество Flash пару лет назад).
Шаг 4: необходимые классы

В классе TUTORIAL_ByteArray (который является основным классом), пожалуйста, импортируйте следующие классы для этого урока:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
package
{
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.events.MouseEvent;
import flash.utils.ByteArray;
import com.Base64;
public class TUTORIAL_ByteArray extends Sprite
{
public function TUTORIAL_ByteArray()
{
}
}
}
|
Шаг 5. Знакомство с Flash Builder I

Добавьте следующий код в конструктор TUTORIAL_ByteArray для очень простого теста.
|
1
2
3
4
5
|
public function TUTORIAL_ByteArray()
{
var _test:String = «Hello world!»;
trace(_test);
}
|
Нажмите клавишу F11, чтобы запустить этот проект, вы должны получить сообщение в окне консоли.
Шаг 6. Знакомство с Flash Builder II

Теперь давайте попробуем отследить сообщение внутри переменной _test , но на этот раз мы сделаем это из другой функции:
|
1
2
3
4
5
6
7
8
|
public function TUTORIAL_ByteArray()
{
var _test:String = «Hello world!»;
TestFunction();
}
private function TestFunction():void{
trace(_test);
}
|
Нажмите CTRL + S, чтобы сохранить ваш проект. Обнаружена ошибка после сохранения вашего проекта; это потому, что переменная, которая была объявлена внутри функции, не будет доступна для любой другой функции. Так что для этого случая нам нужно объявить переменную _test снаружи:
|
1
2
3
4
5
6
7
8
|
public function TUTORIAL_ByteArray()
{
TestFunction();
}
private function TestFunction():void{
trace(_test);
}
private var _test:String = «Hello world!»;
|

Шаг 7: необходимые приватные переменные

Пожалуйста, добавьте следующие частные переменные для этого проекта:
|
01
02
03
04
05
06
07
08
09
10
11
12
|
public function TUTORIAL_ByteArray()
{
TestFunction();
}
private function TestFunction():void{
trace(_test);
}
private var _test:String = «Hello World!»;
private var _loadButton:TextField;
private var _inputField:TextField;
private var _testObject:Object;
private var _testByteArray:ByteArray;
|
Шаг 8: интерфейс
Давайте создадим простой пользовательский интерфейс для этого проекта.

Теперь, когда нам нужно отобразить что-то в нашем проекте, нам нужно объявить размеры нашей сцены (Check Line 13).
Переименуйте нашу TestFunction в функцию InitUI и вставьте следующую строку кодов внутрь. Пожалуйста, прочтите объяснение, прокомментированное внутри кода.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
[SWF(width=»550″, height=»400″, frameRate=»60″, pageTitle=»Tutorial ByteArray»)]
public class TUTORIAL_ByteArray extends Sprite
{
public function TUTORIAL_ByteArray()
{
InitUI();
}
private function InitUI():void{
//Initialize our TextFields so that we can use them
_loadButton = new TextField();
_inputField = new TextField();
//Give a defaultTextFormat for both of them (Tahoma at 11pt, colored 0x777777)
_loadButton.defaultTextFormat = _inputField.defaultTextFormat = new TextFormat(«Tahoma», 11, 0x777777);
//Give both of them a border
_loadButton.border = _inputField.border = true;
//Set the autosize for our Load Button , so that it will automatically shrink / grow to fit the text inside
_loadButton.autoSize = TextFieldAutoSize.LEFT;
//Set the selectable of our Load Button to false, so that user cannot select the text in it
_loadButton.selectable = false;
//Set the multiline and wordWrap of our Input Field to true, so that a long text will automatically wrapped to the next line
_inputField.multiline = _inputField.wordWrap = true;
//Enable user to type something into our Input Field, by setting this type property
_inputField.type = TextFieldType.INPUT;
//Put some text into Both of them
_loadButton.text = «Load»;
_inputField.text = «»;
//Add both of them into stage, so that they are visible to our visitors
addChild(_inputField);
addChild(_loadButton);
//Position our Input Field and make it bigger
_inputField.x = 25;
_inputField.y = 25;
_inputField.width = 200;
_inputField.height = 150;
//There is a reason why i did this, so that the Load Button is located directly below our Input Field
//So you can position the Input Field anywhere you like, as long as there is this code, the Load Button will stick below the Input Field
_loadButton.y = _inputField.y + _inputField.height;
_loadButton.x = _inputField.x;
}
|
Нажмите F11, чтобы запустить этот проект и увидеть простой пользовательский интерфейс, который мы создали.
Шаг 9: Включить интерактивность

Пожалуйста, прочтите объяснение, прокомментированное внутри кода
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
_loadButton.y = _inputField.y + _inputField.height;
_loadButton.x = _inputField.x;
//Add an Event Listener for our _loadButton, so whenever the user clicks this button,
//Flash will call _loadButton_CLICK() Method
_loadButton.addEventListener(MouseEvent.CLICK, _loadButton_CLICK, false, 0, true);
}
//This method will be called whenever user click the _loadButton
private function _loadButton_CLICK(Events:MouseEvent = null):void{
//Get anything that the user input and save them into our _test variable
_test = _inputField.text;
//Trace the _test variable
trace(«User input the following message : » + _test);
}
|
Нажмите F11, чтобы запустить этот проект; попробуйте _inputField что-нибудь в _inputField и затем нажмите кнопку _loadButton . Это самый основной метод получения переменной от нашего пользователя и сохранения ее в нашей закрытой переменной.
Пища для размышлений
Мы наконец достигли наших самых важных шагов в этом проекте, но прежде чем мы продолжим, позвольте мне дать умственный стимул для мышления. В настоящее время в нашем проекте мы можем получить String и сохранить ее в нашей закрытой переменной. Но это только строка; как насчет того, чтобы я хотел, чтобы пользователь _inputField что-то внутри _inputField чтобы я мог получить объект из него? Что должен ввести пользователь? Ответ — «Кодированный Base64 ByteArray»
Шаг 10: Введение в ByteArray

На этот раз мы будем действовать медленно, так что вы поймете класс ByteArray и сможете создавать свои собственные манипуляции с данными и применять их к своим собственным проектам. Пожалуйста, прочтите объяснение, прокомментированное внутри кода:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
public function TUTORIAL_ByteArray()
{
InitUI();
CreateByteArray();
}
private function CreateByteArray():void{
//Initialize our _testObject variable, so that we can populate many dynamic properties and store String data in it (we will load them later whenever user clicked the _loadButton)
_testObject = new Object();
_testObject.name = «Taufik»;
_testObject.website = «<a href=’http://ikt.co.id’>http://ikt.co.id</a>»;
_testObject.occupation = «CTO»;
//Initialize our _byteArray variable, so that we can start converting object into a ByteArray
_testByteArray = new ByteArray();
//Convert the Object into Byte Array, This is how you do it, to convert an Object into a ByteArray, IT IS SIMPLE isnt it?
_testByteArray.writeObject(_testObject);
//Lets see if everything works properly
trace(«Our first ByteArray created :: » + _testByteArray.toString());
}
|
Нажмите F11, чтобы запустить этот проект. Посмотрите, насколько это просто, этот ByteArray — чрезвычайно мощный класс, и все же он совсем не сложен. Мы взяли собственный объект AS3 и преобразовали его в формат сообщения действия .
Перед отправкой данных в наш PHP-скрипт с использованием метода GET мы должны преобразовать их в строку Base64. Это потому, что Base64 может переноситься XML (и HTML).
Шаг 11: Кодирование ByteArray в строку Base64

Пожалуйста, прочитайте объяснение, приведенное в коде.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
private function CreateByteArray():void{
//Initialize our _testObject variable, so that we can populate many dynamic properties and store String data in it
//(we will load them later whenever user clicks the _loadButton)
_testObject = new Object();
_testObject.name = «Taufik»;
_testObject.website = «<a href=’http://ikt.co.id’>http://ikt.co.id</a>»;
_testObject.occupation = «CTO»;
//Initialize our _byteArray variable, so that we can start converting object into a ByteArray
_testByteArray = new ByteArray();
//Convert the Object into Byte Array, This is how you do it, to convert an Object into a ByteArray, IT IS SIMPLE isnt it?
_testByteArray.writeObject(_testObject);
//Encode the ByteArray into Base64 String (so that we can send them via PHP or copy the text to notepad), again IT IS VERY SIMPLE!
var encoded:String = Base64.encodeByteArray(_testByteArray);
//Put the encoded Base64 String into our _inputField (so that we can copy them into notepad)
_inputField.text = encoded;
}
|
Нажмите F11, чтобы запустить этот проект. Если преобразование объекта в ByteArray является простым, преобразование значения Byte наших данных в строку Base64 является простым, благодаря Base64.as.
Шаг 12: преобразование закодированной строки Base64 в объект

Мы будем пытаться декодировать введенную строку Base64 в объект всякий раз, когда пользователь нажимает _loadButton , меняем нашу функцию _loadButton_CLICK . Пожалуйста, прочтите объяснение, прокомментированное внутри кода:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
private function _loadButton_CLICK(Events:MouseEvent = null):void{
//We have to catch any Errors
try{
//We decode our encoded Base64 String into a ByteArray, so that we can retrieve our Object back
var DecodedByteArray:ByteArray = Base64.decodeToByteArray(_inputField.text);
//If converting an Object into ByteArray is simple, retrieving an Object from ByteArray is as simple as this
var LoadedObject:Object = DecodedByteArray.readObject();
//Prepare to output all properties and their values inside the LoadedObject
var Output:String = «»;
for (var VarName:String in LoadedObject){
Output += VarName + » : » + LoadedObject[VarName] + «<br>»;
}
//Output them into our _inputField
_inputField.htmlText = Output;
}catch(err:Error){
_inputField.text = «Please input an Encoded ByteArray into this TextField before clicking the ‘Load’ Button. Error message :: » + err.message;
}
}
|
Нажмите F11, чтобы запустить этот проект. Мы получаем нашу закодированную строку Base64 нашего _testObject внутри нашего _inputField ; нажмите кнопку _loadButton чтобы увидеть, как наш проект конвертирует эту строку Base64 обратно и отображает все ее свойства и значения. Вы можете попробовать скопировать и вставить строки Base64 в начале этого урока и прочитать все мои сообщения.
Вывод
Класс ByteArray — чрезвычайно мощный класс, и, тем не менее, он очень прост в использовании. Я видел много отличных Flash-приложений, использующих этот ByteArray для выполнения столь большого количества умопомрачительных манипуляций с данными, таких как те, которые я упоминал в начале этого урока. Я слышал, что многие программисты Flash-игр используют XML для сохранения своих посетителей «Save Game Data», но, как мы все уже знаем, XML — это чертовски сложный класс; с ByteArray я могу сохранить что-то вроде этого легко.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
private function CreateByteArray():void{
_testObject = new Object();
_testObject.name = «Taufik»;
_testObject.website = «<a href=’http://ikt.co.id’>http://ikt.co.id</a>»;
_testObject.occupation = «CTO»;
_testObject.level = 99;
//Get the state of this Game Character Inventory
var _inventory:Array = new Array({item_id:5, amount:1}, {item_id:85, amount:1}, {item_id:42, amount:5});
_testObject.inventory = _inventory;
//Get what is the skill they already level up
var _skill:Array = new Array({skill_id:1, level:0}, {skill_id:2, level:1});
_testObject.skill = _skill;
//Initialize our _byteArray variable, so that we can start converting object into a ByteArray
_testByteArray = new ByteArray();
//Convert the Object into Byte Array, This is how you do it, to convert an Object into a ByteArray, IT IS SIMPLE isnt it?
_testByteArray.writeObject(_testObject);
//Encode the ByteArray into Base64 String (so that we can send them via PHP or copy the text to notepad), again IT IS VERY SIMPLE!
var encoded:String = Base64.encodeByteArray(_testByteArray);
//Put the encoded Base64 String into our _inputField (so that we can copy them into notepad)
_inputField.text = encoded;
}
|
Да, что-то сложное занимает всего пару строк кода, представьте себе ужас сохранения этих данных с использованием XML и извлечения их для дальнейшего использования. В целом, я должен сказать, что с помощью манипулирования байтовыми данными вы можете достичь многого, и некоторые могут стать решением, которое вы искали все это время.
Я надеюсь, что вы нашли этот урок полезным. Спасибо за прочтение!