![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 177
|
Здравствуйте!
Окажите помощь: мне нужно ассоциативный массив вида: var myArray:Array = new Array( {par1:[0,0], par2:[0,0], par3:[0,0]}, {par1:[0,0], par2:[0,0], par3:[0,0]}) У php программистов эту функциональность обеспечивают функции serialize(), unserialize(). Пожалуйста, дайте ссылки на соответствующий код. Можно на данный функционал реализуемый посредством ByteArray. Нужен "чистый" код, или код из framework Flex. Спасибо! Для меня важно также минимизация символов в строке преобразованного массива и универсальность метода: массивы различной длинны и структуры. |
|
|||||
|
Modus ponens
|
Вам не нужна строка, вам нужен формат сериализации данных. На эту тему есть много информации. 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. |
|
|||||
|
Banned
|
Если вы все таки решили использовать JSON, то ниже, накидал вам код. Здесь представлена цепочка:
Отправка: Инстансы -> JSON -> Строка Прием: Строка -> JSON -> Инстансы 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; } } } } } 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(); } } } 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; } } } Последний раз редактировалось toFL; 18.08.2011 в 14:12. |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 177
|
Использовал такой подход:
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(); Что скажите? Последний раз редактировалось zorexundra; 18.08.2011 в 14:14. |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 177
|
Цитата:
Спасибо всем за участие! Моё решение меня полностью удовлетворило. |
![]() |
![]() |
Часовой пояс GMT +4, время: 21:11. |
|
|
« Предыдущая тема | Следующая тема » |
|
|