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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.05.2012, 21:18
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 21  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Кордум имел в виду такую конструкцию:
Код AS3:
parameter= Boolean( Number(objectNode.@parameter) );
Сам пользуюсь сравнением строки, мне "true" и "false" ближе и роднее, чем 1 и 0.
__________________
Reality.getBounds(this);

Старый 13.05.2012, 14:42
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 22  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 612
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
Вот мой "велосипед". Название корневого нода уходит в параметр id и наоборот:
Код AS3:
package atflash.remote.serializations
{
 
	import atflash.errors.Logger;
 
	/**
	 * Сериализует аттрибуты и вложенности в виде массива
	 * @author rzer
	 * @version 1.01
	 */
 
	public class CleverXML {
 
		public static function serialize(packet:Object):String {
 
			try {
				var xml:XML = objectToXML(packet, packet.id, true);
				var result:String = xml.toXMLString();
 
			}catch (err:Error) {
				Logger.error("[CleverXML] Error while serialize object " + err.message);
				Logger.error(err);
			}
 
			return result;
		}
 
		public static function deserialize(val:String):Object {
 
			try {
				var xml:XML = new XML(val);
				var obj:Object = objectFromXML(xml, true);
 
			} catch (err:Error) {
				Logger.error("[CleverXML] Error while deserialize xml: " + err.message + " " + val);
				Logger.error(err);
			}
 
			return obj;
 
		}
 
 
		private static function objectFromXML(source:XML, insertId:Boolean = false):Object {
 
			if (source.toXMLString() == "") {
				return null;
			}
 
 
			var result:Object = parseAttributes(source);
 
 
 
			if (insertId) {
				result["id"] = source.name().toString();
			}
 
			for (var i:int = 0; i < source.children().length(); i++) {
 
				var anItem:XML = source.children()[i];
				var aName:String;
				var anArray:Array;
 
				if (anItem.nodeKind() == "text") {
 
					aName = "text";
					result[aName] = String(anItem);
 
				}else {
 
					aName = anItem.name().toString();
 
					anArray = result[aName];
 
					if (!anArray) {
						anArray = new Array();
					}
 
					anArray.push(objectFromXML(anItem));
 
					result[aName] = anArray;
				}
 
 
			}
 
			return result;
		}
 
		private static function objectToXML(source:Object, nodeName:String, ignoreID:Boolean = false):XML {
 
			var result:XML = <packet/>;
			result.setName(nodeName);
 
 
			for (var item:String in source) {
 
				var anItem:* = source[item];
 
				switch (typeof(anItem)) {
 
					case "boolean":
					case "string":
					case "number":	{
 
						if (!ignoreID || item != "id") {
 
							result.@[item] = anItem;
						}
 
						break;
					}
 
					case "object":	{
 
						if (anItem is Array) {
							var anArray:Array;
 
							anArray = anItem as Array;
 
							if (anArray.length > 0) {
								for (var i:int = 0; i < anArray.length; i++) {
									result.appendChild(objectToXML(anArray[i], item));
								}
							} else {
								result.appendChild(objectToXML(anItem as Object, item));
							}
						} else {
							result.appendChild(objectToXML(anItem as Object, item));
						}
 
						break;
					}
 
					case "xml": {
						result.appendChild(anItem);
						break;
					}
 
				}
			}
 
 
			return result;
 
		}
 
		private static function parseAttributes(source:XML):Object {
 
			var result:Object = new Object();
 
			var aList:XMLList = source.attributes();
 
			for (var i:int = 0; i < aList.length(); i++) {
 
				var anItem:XML = aList[i];
				var aName:String = anItem.name().toString();
				var anAttribute:String = anItem.toXMLString();
 
				if (String(Number(anAttribute)) == anAttribute) {
					result[aName] = Number(anAttribute);
				} else {
					result[aName] = anAttribute;
				}
			}
 
			return(result);
		}
 
 
 
	}
 
}


Последний раз редактировалось Rzer; 13.05.2012 в 14:47.
Старый 16.05.2012, 04:10
Партизан вне форума Посмотреть профиль Отправить личное сообщение для Партизан Найти все сообщения от Партизан
  № 23  
Ответить с цитированием
Партизан
 
Аватар для Партизан

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
Может я тоже чего не понимаю?
Но как-то не вижу я преимуществ у obj.win.id[0].parameters.title.lang['ru'] и xml..lang.(@name=='ru')?

Старый 16.05.2012, 06:45
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 24  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
доступ к свойствам объекта быстрее чем к xml
даже такая ересь как:
Код AS3:
	var s:String = (function(list:XMLList):XML
	{
		for each (var node:XML in list)
		{
			if (node.@id == 'ru')
			{
				return node;
			}
		}
 
		return null;
	})(xml.languages.item).@flag;
работает быстрее, чем:
Код AS3:
	var s:String = xml.languages.item.(@id == "ru").@flag;
в целом я за строгую типизацию объектов, languages = Vector.<Item>, item = Item, id = Item.#id, flag = Item.#flag и за хранение локализации в отдельных друг от друга xml файлах с одинаковой структурой


Последний раз редактировалось Nooob; 16.05.2012 в 06:54.
Старый 16.05.2012, 08:03
stweet вне форума Посмотреть профиль Отправить личное сообщение для stweet Найти все сообщения от stweet
  № 25  
Ответить с цитированием
stweet
 
Аватар для stweet

Регистрация: Mar 2010
Адрес: 54.713862552265084 = 20.442724227905273
Сообщений: 449
Отправить сообщение для stweet с помощью Skype™
Код AS3:
if (String(xml.@atr).length != 0 && String(xml.@atr) == "true") myBoolean = true;
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь!

Старый 16.05.2012, 10:50
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 26  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
stweet, а что, String(xml.@atr) может быть строкой "true" и при этом иметь длину 0?
А если в xml будет написано TRUE, то это уже не тру?
__________________
Reality.getBounds(this);

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Цитата:
Сообщение от Партизан Посмотреть сообщение
Может я тоже чего не понимаю?
Но как-то не вижу я преимуществ у obj.win.id[0].parameters.title.lang['ru'] и xml..lang.(@name=='ru')?
Это как раз одно из тех неявных заблуждений, о которых я говорил. В случае с XMLем имеем перебор и фильтрацию всех потомков узла xml с именем lang и потом еще эту выбранную группу фильтруем по id можно сказать, что в худшем случае получаем O(n^2), в то время как в случае с объектом имеем обычный доступ по имени, который фактически O(1).

Цитата:
Сообщение от Nooob Посмотреть сообщение
доступ к свойствам объекта быстрее чем к xml
даже такая ересь как:
Код AS3:
	var s:String = (function(list:XMLList):XML
	{
		for each (var node:XML in list)
		{
			if (node.@id == 'ru')
			{
				return node;
			}
		}
 
		return null;
	})(xml.languages.item).@flag;
работает быстрее, чем:
Код AS3:
	var s:String = xml.languages.item.(@id == "ru").@flag;
в целом я за строгую типизацию объектов, languages = Vector.<Item>, item = Item, id = Item.#id, flag = Item.#flag и за хранение локализации в отдельных друг от друга xml файлах с одинаковой структурой
Это потому, что в сгенерированном коде для "обычного" выражения внутри фильтра вместо того, чтобы просматривать только свойства текущего выбранного узла просматриваются все свойства доступные в текущем окружении (которое включает в себя узел). А еще и потому, что "обычный" код создает список, а вы возвращаете только один из элементов - т.е. код не делает одно и то же.

Но как я уже говорил, пытаться использовать XML в местах критичных к скорости - заниматься ерундой, т.как для каждой задачи существуют лучшие и худшие структуры данных, которые будут работать лучше любого универсального хранилища данных, а XML - даже на универсальное хранилище не потянет (т.е. в сравнении с SQL базами данных, например).
__________________
Hell is the possibility of sanity

Старый 16.05.2012, 12:34
Партизан вне форума Посмотреть профиль Отправить личное сообщение для Партизан Найти все сообщения от Партизан
  № 28  
Ответить с цитированием
Партизан
 
Аватар для Партизан

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
Код AS3:
var xml:XML = <windowstyle>
							<win id="0">
								<parameters>
									<title>
										<lang name="ru">Окно</lang>
										<lang name="en">Window</lang>
									</title>
									<width>400</width>
									<height>500</height>
									<scale>true</scale>
								</parameters>
								<next>
								</next>
							</win>
						</windowstyle>;
 
			var obj:Object = { 'win': { 'parameters': { 'title': { 'lang': { 'name':'ru' }}}}};
			var xt:Number = 0;
			var t:Number = getTimer();
			//trace(xml.win.parameters.title.lang.@name[0])
			trace(xml..lang.@name[0])
			xt = getTimer();
			trace(obj.win.parameters.title.lang.name)
			trace(xt-t, getTimer() - xt);
Не знаю... XML - отличная вещь, переводить его в obj считаю извращением(не говоря уже о времени которое на это затрачивается)...
По скорости... хз, не могу представить себе ситуацию в которой был выбран XML как форма передачи данных, и скорость обработки этих данных была бы неудовлетворительной. По примеру выше я разницы в скорости не нашел. По опыту разбора XML тоже не припомню чтобы я пошел на какие-то извращения из-за скорости доступа к XML... Перефразирую свой первый пост: "Зачем?"

Старый 16.05.2012, 16:17
stweet вне форума Посмотреть профиль Отправить личное сообщение для stweet Найти все сообщения от stweet
  № 29  
Ответить с цитированием
stweet
 
Аватар для stweet

Регистрация: Mar 2010
Адрес: 54.713862552265084 = 20.442724227905273
Сообщений: 449
Отправить сообщение для stweet с помощью Skype™
Цитата:
Сообщение от Wolsh Посмотреть сообщение
stweet, а что, String(xml.@atr) может быть строкой "true" и при этом иметь длину 0?
А если в xml будет написано TRUE, то это уже не тру?
ну ... исходя из правил условия, сначала проверяется левая часть, а потом правая, так вот, в данном условии я сначала проверяю есть ли вообще такой атрибут и есть ли в нём содержимое, а потом проверяю чему равен данный атрибут, если оба условия устраивает изменяю содержимое переменной. Как то так = )

Бывает, получаю атрибуты такого вида "fasle", "tru", "True", "FALSE" и т.п. или вообще заказчик их попросту не ставит.
Мне пришлось прибежать к сие действиям т.к. иногда заказчики попадаются далёкие от xml и постоянно жалуются на то что мои продукты не работают должным образом. На самом деле это только верхушка айсберга =)
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь!

Старый 16.05.2012, 16:33
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 30  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Тогда Вам стоит прислушаться к совету КорДума и использовать 0 и 1 ))))
А проблемы с True и TRUE решаются преобразованием к строчным String#toLowerCase() перед сравнением.
Цитата:
сначала проверяется левая часть...
Но Вы проверяете не на наличие атрибута, а добываете само строковое значение, так что выигрыша "чтобы не делать лишних операций" — никакого. В точности наоборот. Да и сам.. алгоритм выглядит по-индийски: если (тру) то а = тру. В скобках Вы УЖЕ получили требуемое булево. Не проще ли а = (тру)?
__________________
Reality.getBounds(this);

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

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

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


 


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


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