Флекс-сериализаторы.
До недавнего времени (до версии 11 виртуальной машины Флеш) во Флексе не было стандартного сериализатора, поэтому одной из популярных самописных дополнений к Flex были всякие библиотеки сериализации. Потом в 11-м флексе появился стандартный JSON-сериализатор (в корневом пространстве имен). Но мои эксперименты с ним не удались, с коллекциями он не работает - а это основная структура данных Flex.
Для того, чтобы постоянно не дергать мои сервисы (http://service.flyseason.ru/), тем более менеджеры постоянно там перезагружают билеты (a на живой базе отлаживать софт неудобно - получается что при одном запросе к web-сервисам там например было два билета, а при следующем уже один, а еше при следующем ни одного) - мне понадобилось сериализовать ответ веб-сервиса, чтобы сохранить его.
Я создал вот такой промежуточный класс (а, как вы понимаете, класс valueObjects вообще никак невозможно сериализовать):
1: package
2: {
3: public class OneTicketBase
4: {
5: public var i : int;
6: public var ID : String;
7: public var ReturnID : String;
8: public var CrDate : String;
9: public var Special : int;
10: public var FromCountry : String;
11: public var FromCity : String;
12: public var FromAirport : String;
13: public var ToCountry : String;
14: public var ToCity : String;
15: public var ToAirport : String;
16: public var FromDate : String;
17: public var FromTime : String;
18: public var FlyTime : String;
19: public var AviaCompany : String;
20: public var AviaCompanyCode : String;
21: public var FlyNumber : String;
22: public var FlyClass : String;
23: public var Price : Number;
24: public var HowMany : String;
25: public var AirTransfer : String;
26: public var AirTransferComment : String;
27:
28: public function OneTicketBase()
29: {
30: }
31: }
32: }
И переписал в него данные из valueObkects:
1: var TicketsBase:ArrayCollection = new ArrayCollection;
2: for (var i:int;i<Tickets.length;i++){
3:
4: var DirectOne:OneTicket= Tickets[i].DirectTicketInfo;
5: var DirectBase:OneTicketBase = new OneTicketBase;
6: DirectBase.i = DirectOne.i;
...
27: DirectBase.AirTransferComment = DirectOne.AirTransferComment;
28:
29: var ReturnOne:OneTicket= Tickets[i].ReturnTicketInfo;
30: var ReturnBase:OneTicketBase = new OneTicketBase;
31: ReturnBase.i = ReturnOne.i;
...
52: ReturnBase.AirTransferComment = ReturnOne.AirTransferComment;
53:
54: TicketsBase.addItem({
55: "TicketType":Tickets[i].TicketType,
56: "USDCurs":Tickets[i].USDCurs,
57: "DirectTicket":DirectBase.ID,
58: "ReturnTicket":ReturnBase.ID,
59: "DirectTicketInfo":DirectBase,
60: "ReturnTicketInfo":ReturnBase
61: });
62: }
Далее, чтобы сохранить результат запроса к web-сервисам в файл, я попытался сериализовать эту АррайКоллекцию с помощью стандартного Адобовского Топ-Класса JSON
64: var Str2:String = JSON.stringify(TicketsBase);
65:
66: var FR:FileReference = new FileReference();
67: FR.save(Str2);
Все что я видел - только ошибку:
Error: Unknown Property: 'dispatchResetEvent'.
at mx.collections::ListCollectionView/http://www.adobe.com/2006/actionscript/flash/proxy::getProperty()[E:\dev\4.y\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:870]
at JSON$/stringifySpecializedToString()
at JSON$/stringify()
at INDIA_Tickets/button2_clickHandler()[G:\Flex\INDIA_Tickets\src\INDIA_Tickets.mxml:64]
at INDIA_Tickets/___INDIA_Tickets_Button2_click()[G:\Flex\INDIA_Tickets\src\INDIA_Tickets.mxml:250]
Я призадумался и перепробовал несколько известных FLEX-сериалиаторов (помимо стандартного, появившегося в 11-й версии виртуальной машины ФЛЕШ):
Искомый результат (без дополнительных усилий) получился у меня только во Flame (многократно расхваленной мною микрософтовской библиотеке):
{ "filterFunction" : null, "length" : 3, "list" : { "length" : 3, "source" : [ { "DirectTicket" : "b2ce0e6c-8ca1-4dff-a658-be046127bca9", "DirectTicketInfo" : { "AirTransfer" : "Нет", "AirTransferComment" : "-", "AviaCompany" : null, "AviaCompanyCode" : "YM", "CrDate" : "13.03.2012", "FlyClass" : "Economy", "FlyNumber" : "612", "FlyTime" : "14:20", "FromAirport" : "TIV", "FromCity" : "Тиват", "FromCountry" : "Черногория", "FromDate" : "15.06.2012", "FromTime" : "09:20", "HowMany" : "Есть", "ID" : "b2ce0e6c-8ca1-4dff-a658-be046127bca9", "Price" : 282.14999999999998, "ReturnID" : null, "Special" : 0, "ToAirport" : "DMD", "ToCity" : "Москва", "ToCountry" : "Россия", "i" : 18107 }, "ReturnTicket" : "1d730314-0e8d-4b2e-9fe6-52d0eed2f8c2", "ReturnTicketInfo" : { "AirTransfer" : "Нет", "AirTransferComment" : "-", "AviaCompany" : null, "AviaCompanyCode" : "YM", "CrDate" : "13.03.2012", "FlyClass" : "Economy", "FlyNumber" : "613", "FlyTime" : "16:55", "FromAirport" : "DMD", "FromCity" : "Москва", "FromCountry" : "Россия", "FromDate" : "16.06.2012", "FromTime" : "14:55", "HowMany" : "Есть", "ID" : "1d730314-0e8d-4b2e-9fe6-52d0eed2f8c2", "Price" : 282.14999999999998, "ReturnID" : null, "Special" : 0, "ToAirport" : "TIV", "ToCity" : "Тиват", "ToCountry" : "Черногория", "i" : 17762 }, "TicketType" : { }, "USDCurs" : 30.15531 }, { "DirectTicket" : "925ca5a3-41d4-4600-bed0-66819b65f653", "DirectTicketInfo" : { "AirTransfer" : "Нет", "AirTransferComment" : "-", "AviaCompany" : null, "AviaCompanyCode" : "YM", "CrDate" : "13.03.2012", "FlyClass" : "Economy", "FlyNumber" : "614", "FlyTime" : "01:10", "FromAirport" : "TIV", "FromCity" : "Тиват", "FromCountry" : "Черногория", "FromDate" : "15.06.2012", "FromTime" : "20:10", "HowMany" : "Есть", "ID" : "925ca5a3-41d4-4600-bed0-66819b65f653", "Price" : 282.14999999999998, "ReturnID" : null, "Special" : 0, "ToAirport" : "DMD", "ToCity" : "Москва", "ToCountry" : "Россия", "i" : 18106 }, "ReturnTicket" : "1d730314-0e8d-4b2e-9fe6-52d0eed2f8c2", "ReturnTicketInfo" : { "AirTransfer" : "Нет", "AirTransferComment" : "-", "AviaCompany" : null, "AviaCompanyCode" : "YM", "CrDate" : "13.03.2012", "FlyClass" : "Economy", "FlyNumber" : "613", "FlyTime" : "16:55", "FromAirport" : "DMD", "FromCity" : "Москва", "FromCountry" : "Россия", "FromDate" : "16.06.2012", "FromTime" : "14:55", "HowMany" : "Есть", "ID" : "1d730314-0e8d-4b2e-9fe6-52d0eed2f8c2", "Price" : 282.14999999999998, "ReturnID" : null, "Special" : 0, "ToAirport" : "TIV", "ToCity" : "Тиват", "ToCountry" : "Черногория", "i" : 17762 }, "TicketType" : { }, "USDCurs" : 30.15531 }, { "DirectTicket" : "c0ae6276-1085-422c-87e5-f1b4c17b8e72", "DirectTicketInfo" : { "AirTransfer" : "Нет", "AirTransferComment" : "-", "AviaCompany" : null, "AviaCompanyCode" : "YC", "CrDate" : "13.03.2012", "FlyClass" : "Economy", "FlyNumber" : "445", "FlyTime" : "15:00", "FromAirport" : "TIV", "FromCity" : "Тиват", "FromCountry" : "Черногория", "FromDate" : "15.06.2012", "FromTime" : "10:00", "HowMany" : "Есть", "ID" : "c0ae6276-1085-422c-87e5-f1b4c17b8e72", "Price" : 256.5, "ReturnID" : null, "Special" : 0, "ToAirport" : "DMD", "ToCity" : "Москва", "ToCountry" : "Россия", "i" : 18104 }, "ReturnTicket" : "1d730314-0e8d-4b2e-9fe6-52d0eed2f8c2", "ReturnTicketInfo" : { "AirTransfer" : "Нет", "AirTransferComment" : "-", "AviaCompany" : null, "AviaCompanyCode" : "YM", "CrDate" : "13.03.2012", "FlyClass" : "Economy", "FlyNumber" : "613", "FlyTime" : "16:55", "FromAirport" : "DMD", "FromCity" : "Москва", "FromCountry" : "Россия", "FromDate" : "16.06.2012", "FromTime" : "14:55", "HowMany" : "Есть", "ID" : "1d730314-0e8d-4b2e-9fe6-52d0eed2f8c2", "Price" : 282.14999999999998, "ReturnID" : null, "Special" : 0, "ToAirport" : "TIV", "ToCity" : "Тиват", "ToCountry" : "Черногория", "i" : 17762 }, "TicketType" : { }, "USDCurs" : 30.15531 } ], "uid" : "6B468147-E57E-48FF-CF5C-F36FB03BE6E7" }, "sort" : null, "source" : [ { "DirectTicket" : "b2ce0e6c-8ca1-4dff-a658-be046127bca9", "DirectTicketInfo" : { "AirTransfer" : "Нет", "AirTransferComment" : "-", "AviaCompany" : null, "AviaCompanyCode" : "YM", "CrDate" : "13.03.2012", "FlyClass" : "Economy", "FlyNumber" : "612", "FlyTime" : "14:20", "FromAirport" : "TIV", "FromCity" : "Тиват", "FromCountry" : "Черногория", "FromDate" : "15.06.2012", "FromTime" : "09:20", "HowMany" : "Есть", "ID" : "b2ce0e6c-8ca1-4dff-a658-be046127bca9", "Price" : 282.14999999999998, "ReturnID" : null, "Special" : 0, "ToAirport" : "DMD", "ToCity" : "Москва", "ToCountry" : "Россия", "i" : 18107 }, "ReturnTicket" : "1d730314-0e8d-4b2e-9fe6-52d0eed2f8c2", "ReturnTicketInfo" : { "AirTransfer" : "Нет", "AirTransferComment" : "-", "AviaCompany" : null, "AviaCompanyCode" : "YM", "CrDate" : "13.03.2012", "FlyClass" : "Economy", "FlyNumber" : "613", "FlyTime" : "16:55", "FromAirport" : "DMD", "FromCity" : "Москва", "FromCountry" : "Россия", "FromDate" : "16.06.2012", "FromTime" : "14:55", "HowMany" : "Есть", "ID" : "1d730314-0e8d-4b2e-9fe6-52d0eed2f8c2", "Price" : 282.14999999999998, "ReturnID" : null, "Special" : 0, "ToAirport" : "TIV", "ToCity" : "Тиват", "ToCountry" : "Черногория", "i" : 17762 }, "TicketType" : { }, "USDCurs" : 30.15531 }, { "DirectTicket" : "925ca5a3-41d4-4600-bed0-66819b65f653", "DirectTicketInfo" : { "AirTransfer" : "Нет", "AirTransferComment" : "-", "AviaCompany" : null, "AviaCompanyCode" : "YM", "CrDate" : "13.03.2012", "FlyClass" : "Economy", "FlyNumber" : "614", "FlyTime" : "01:10", "FromAirport" : "TIV", "FromCity" : "Тиват", "FromCountry" : "Черногория", "FromDate" : "15.06.2012", "FromTime" : "20:10", "HowMany" : "Есть", "ID" : "925ca5a3-41d4-4600-bed0-66819b65f653", "Price" : 282.14999999999998, "ReturnID" : null, "Special" : 0, "ToAirport" : "DMD", "ToCity" : "Москва", "ToCountry" : "Россия", "i" : 18106 }, "ReturnTicket" : "1d730314-0e8d-4b2e-9fe6-52d0eed2f8c2", "ReturnTicketInfo" : { "AirTransfer" : "Нет", "AirTransferComment" : "-", "AviaCompany" : null, "AviaCompanyCode" : "YM", "CrDate" : "13.03.2012", "FlyClass" : "Economy", "FlyNumber" : "613", "FlyTime" : "16:55", "FromAirport" : "DMD", "FromCity" : "Москва", "FromCountry" : "Россия", "FromDate" : "16.06.2012", "FromTime" : "14:55", "HowMany" : "Есть", "ID" : "1d730314-0e8d-4b2e-9fe6-52d0eed2f8c2", "Price" : 282.14999999999998, "ReturnID" : null, "Special" : 0, "ToAirport" : "TIV", "ToCity" : "Тиват", "ToCountry" : "Черногория", "i" : 17762 }, "TicketType" : { }, "USDCurs" : 30.15531 }, { "DirectTicket" : "c0ae6276-1085-422c-87e5-f1b4c17b8e72", "DirectTicketInfo" : { "AirTransfer" : "Нет", "AirTransferComment" : "-", "AviaCompany" : null, "AviaCompanyCode" : "YC", "CrDate" : "13.03.2012", "FlyClass" : "Economy", "FlyNumber" : "445", "FlyTime" : "15:00", "FromAirport" : "TIV", "FromCity" : "Тиват", "FromCountry" : "Черногория", "FromDate" : "15.06.2012", "FromTime" : "10:00", "HowMany" : "Есть", "ID" : "c0ae6276-1085-422c-87e5-f1b4c17b8e72", "Price" : 256.5, "ReturnID" : null, "Special" : 0, "ToAirport" : "DMD", "ToCity" : "Москва", "ToCountry" : "Россия", "i" : 18104 }, "ReturnTicket" : "1d730314-0e8d-4b2e-9fe6-52d0eed2f8c2", "ReturnTicketInfo" : { "AirTransfer" : "Нет", "AirTransferComment" : "-", "AviaCompany" : null, "AviaCompanyCode" : "YM", "CrDate" : "13.03.2012", "FlyClass" : "Economy", "FlyNumber" : "613", "FlyTime" : "16:55", "FromAirport" : "DMD", "FromCity" : "Москва", "FromCountry" : "Россия", "FromDate" : "16.06.2012", "FromTime" : "14:55", "HowMany" : "Есть", "ID" : "1d730314-0e8d-4b2e-9fe6-52d0eed2f8c2", "Price" : 282.14999999999998, "ReturnID" : null, "Special" : 0, "ToAirport" : "TIV", "ToCity" : "Тиват", "ToCountry" : "Черногория", "i" : 17762 }, "TicketType" : { }, "USDCurs" : 30.15531 } ] }
Единственное, с чем не справился этот сериализатор, это с классом TicketType типа ENUM:
1: package
2: {
3: public final class TicketType
4: {
5: public static const Good:TicketType = new TicketType(Good);
6: public static const Less:TicketType = new TicketType(Less);
7: public static const More:TicketType = new TicketType(More);
8:
9: public function TicketType(value:TicketType)
10: {
11: }
12: }
13: }
При загрузке этих данных и десиализации мне пришлось просто добавить этот параметр вручную - Обработка собственных событий из ItemRenderer
|