Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.08.2011, 12:46
zorexundra вне форума Посмотреть профиль Отправить личное сообщение для zorexundra Найти все сообщения от zorexundra
  № 1  
Ответить с цитированием
zorexundra

Регистрация: Dec 2010
Сообщений: 177
Question Преобразование Array в строку и обратно

Здравствуйте!
Окажите помощь:
мне нужно ассоциативный массив вида:
Код AS3:
var myArray:Array = new Array(
{par1:[0,0], par2:[0,0], par3:[0,0]},
{par1:[0,0], par2:[0,0], par3:[0,0]})
преобразовать в строку, а затем выполнить обратное преобразование данной строки в объект Array.
У php программистов эту функциональность обеспечивают функции serialize(), unserialize().
Пожалуйста, дайте ссылки на соответствующий код. Можно на данный функционал реализуемый посредством ByteArray. Нужен "чистый" код, или код из framework Flex. Спасибо!
Для меня важно также минимизация символов в строке преобразованного массива и универсальность метода: массивы различной длинны и структуры.

Старый 18.08.2011, 12:50
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 2  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Можно переопределить toString(), то есть, создать класс на основе Array. Еще определить у него метод, обратный toString().
__________________
тут я

Старый 18.08.2011, 13:12
Genzo вне форума Посмотреть профиль Отправить личное сообщение для Genzo Посетить домашнюю страницу Genzo Найти все сообщения от Genzo
  № 3  
Ответить с цитированием
Genzo
 
Аватар для Genzo

блогер
Регистрация: Feb 2010
Адрес: MSK
Сообщений: 859
Записей в блоге: 3
Отправить сообщение для Genzo с помощью ICQ Отправить сообщение для Genzo с помощью Skype™
смотрите в сторону JSON

Старый 18.08.2011, 13:22
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 4  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
JSON
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 18.08.2011, 13:27
Genzo вне форума Посмотреть профиль Отправить личное сообщение для Genzo Посетить домашнюю страницу Genzo Найти все сообщения от Genzo
  № 5  
Ответить с цитированием
Genzo
 
Аватар для Genzo

блогер
Регистрация: Feb 2010
Адрес: MSK
Сообщений: 859
Записей в блоге: 3
Отправить сообщение для Genzo с помощью ICQ Отправить сообщение для Genzo с помощью Skype™
Цитата:
Для меня важно также минимизация символов в строке преобразованного массива и универсальность метода: массивы различной длинны и структуры.
Есть вариант записывать ваш массив в ByteArray , компрессовать и переводить в base64. Это выгодно ,если в массиве вы храните не строки.

Старый 18.08.2011, 13:43
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Вам не нужна строка, вам нужен формат сериализации данных. На эту тему есть много информации. JSON - один из многих форматов сериализации данных (т.е. записи их с возможностью впоследствии восстановить в исходный вид). JSON - плохой формат по ряду причин:
- невозможно представить ссылки на объекты (и, как следствие, невозможно реализовать циклические связи, или отношения много <-> много).
- избыточный в плане записи (он допускает повторения, что, по определению, избыточно).
- плохо предназначен для передачи по сети, т.как имеет иерархическую структуру - это значит, что невозможно создать объект не создавая все объекты которе являются его свойствами, или членами массива. Т.е. это унаследованная особенность любого формата который вместо того, чтобы сначала описать размер передаваемых данных использует 2 разделителя (парные кавычки, скобки и т.п.).
- Что касается использования JSON в комбинации с ECMAScript-производными языками, то JSON плох тем, что никак не отражает тот факт, что класс Array в ECMAScript является динамическим, и в этом формате нет возможности представить динамически созданные свойсва объекта типа Array.
- Применительно к флешу формат плох тем, что нет возможности сохранить тип объектов, т.е. если вы использовали любой пользовательский класс, в JSON нет никаких средств для того, чтобы отразить этот факт.

JSON незначительно выигрывает на фоне XML (который страдает всеми теми же недостатками, но еще хуже в плане избыточности). Но разница маргинальная по сравнению с тем, как, в теории можно организовать данные. Другое, теоретическое преимущество JSON в том, что он в сериализированом виде понятен человеку.

Во флеше, для сериализации плеером используется AMF, он гораздо более логично спроектирован чем тот же JSON. В PHP есть библиотеки, которые умеют этот формат читать и писать (AMFPHP например).
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 18.08.2011 в 13:51.
Старый 18.08.2011, 14:03
toFL вне форума Посмотреть профиль Найти все сообщения от toFL
  № 7  
Ответить с цитированием
toFL
Banned

Регистрация: May 2011
Адрес: +48° 27' 57.93", +35° 2' 46.02"
Сообщений: 447
Записей в блоге: 2
Отправить сообщение для toFL с помощью Skype™
Если вы все таки решили использовать JSON, то ниже, накидал вам код. Здесь представлена цепочка:

Отправка: Инстансы -> JSON -> Строка
Прием: Строка -> JSON -> Инстансы

Код AS3:
package {
	import flash.display.Sprite;
 
	public class Main extends Sprite {
		private var myArray:Array = new Array();
 
		public function Main() {
			//забиваем массив
			myArray.push(new MyObject(1, [new Par(1, [0,0]), new Par(2, [0,0]), new Par(3, [0,0])]));
			myArray.push(new MyObject(2, [new Par(1, [0,0]), new Par(2, [0,0]), new Par(3, [0,0])]));
 
			var serializer:Serializer = new Serializer();
 
			//получаем строку для отправки
			var sendData:String = serializer.serialize(myArray);
 
			//получаем из строки Object
			var obj:Object = serializer.unserialize(sendData);
 
			//обнуляем наши объекты
			myArray = new Array();
 
			//парсим Object
			var i:uint = 1;
			var id:uint = 1;
			while (true) {
				if (obj.hasOwnProperty("object" + id)) {
					i = 1;
					var list:Array = new Array();
					while (true) {
						if (obj["object" + id].hasOwnProperty("par" + i)) {
							list.push(new Par(i, obj["object" + id]["par" + i].split("")));
							i++
						} else {
							id++;
							break;
						}
					}
					myArray.push(new MyObject(id, list));
				} else {
					break;
				}
			}
		}
	}
}
Сериализатор:
Код AS3:
package {
	import com.adobe.serialization.json.*;
 
	public class Serializer {
		public function Serializer() {
 
		}
		public function serialize (list:Array):String {
			var obj:Object = new Object();
			var json:JSONEncoder;
 
			for (var i:uint = 0; i < list.length; i++) {
				var myObject:MyObject = list[i] as MyObject;
				obj[myObject.getName()] = myObject.getObject();
			}
			json = new JSONEncoder(obj);
 
			return json.getString();
		}
		public function unserialize (str:String):Object {
			var obj:JSONDecoder = new JSONDecoder(str, false);
			return obj.getValue();
		}
	}
}
Код AS3:
package {
	public class MyObject {
		private var id:uint;
		private var list:Array;
 
		public function MyObject(id:uint, list:Array) {
			this.id = id;
			this.list = list;
		}
		public function getName ():String {
			return "object" + id;
		}
		public function getObject ():Object {
			var obj:Object = new Object;
			for (var i:uint = 0; i < list.length; i++) {
				var par:Par = list[i] as Par;
				obj[par.getName()] = par.getObject();
			}
			return obj;
		}
	}
}
Код AS3:
package {
	public class Par {
		private var id:uint;
		private var data:Array;
 
		public function Par(id:uint, data:Array) {
			this.id = id;
			this.data = data;
		}
		public function getName ():String {
			return "par" + id;
		}
		public function getObject ():String {
			return this.data.toString();
		}
	}
}
В идеале, лучше использовать типизированные массивы (тем более для Serializer). Так же в этом примере, в ф-циях serialize и unserialize можно использовать любой предпочитаемый вами формат обмена данными (например тот же AMF).


Последний раз редактировалось toFL; 18.08.2011 в 14:12.
Старый 18.08.2011, 14:12
zorexundra вне форума Посмотреть профиль Отправить личное сообщение для zorexundra Найти все сообщения от zorexundra
  № 8  
Ответить с цитированием
zorexundra

Регистрация: Dec 2010
Сообщений: 177
Использовал такой подход:
Код AS3:
var ba:ByteArray = new ByteArray();
ba.writeObject(myArray);
ba.position = 0;
var baEncBase64:Base64Encoder = new Base64Encoder();
baEncBase64.encodeBytes(ba)
var serializeString:String = baEncBase64.toString();
var baDecBase64:Base64Decoder = new Base64Decoder();
baDecBase64.decode(serializeString);
ba =  baDecBase64.toByteArray();
ba.position = 0;
var remakeMyArray:Array = ba.readObject();
но remakeMyArray не соответствует myArray (он как-то перемешан)
Что скажите?


Последний раз редактировалось zorexundra; 18.08.2011 в 14:14.
Старый 18.08.2011, 14:23
Genzo вне форума Посмотреть профиль Отправить личное сообщение для Genzo Посетить домашнюю страницу Genzo Найти все сообщения от Genzo
  № 9  
Ответить с цитированием
Genzo
 
Аватар для Genzo

блогер
Регистрация: Feb 2010
Адрес: MSK
Сообщений: 859
Записей в блоге: 3
Отправить сообщение для Genzo с помощью ICQ Отправить сообщение для Genzo с помощью Skype™
Цитата:
он как-то перемешан
это как?
попробуйте создавать другой объект ByteArray и записывать туда десереализацию

Старый 18.08.2011, 14:36
zorexundra вне форума Посмотреть профиль Отправить личное сообщение для zorexundra Найти все сообщения от zorexundra
  № 10  
Ответить с цитированием
zorexundra

Регистрация: Dec 2010
Сообщений: 177
Цитата:
Сообщение от Genzo Посмотреть сообщение
это как?
попробуйте создавать другой объект ByteArray и записывать туда десереализацию
Всё оказалось в порядке: просто "напортачил" на другом участке кода.
Спасибо всем за участие! Моё решение меня полностью удовлетворило.

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:11.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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