Флекс-сериализаторы.
До недавнего времени (до версии 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
Flex context:
)
|
|