(Flex) Flex (2012 год)

Флекс-сериализаторы.

До недавнего времени (до версии 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

Comments ( )
Link to this page: //www.vb-net.com/Flex_Serialize/index.htm
< THANKS ME>