【问题标题】:How to deserialize array collection in flex如何在flex中反序列化数组集合
【发布时间】:2012-09-27 06:53:31
【问题描述】:

我遇到了一个问题: 在其中我将数组集合序列化到文件中,数组集合有两种类型的项目,图像和类对象。 它序列化成功,但是当我反序列化它时,它只是返回对象的数组集合,我发现我自己无法将这些对象转换为图像和类对象(这个类是我自己定义的,有三个成员,两个图像和一个形状)。

我正在添加我使用的代码:

[Bindable] var objcnvs:ClassCanvas;
        protected function btnSave_clickHandler(event:MouseEvent):void
        {
            //for saving  data serializaion

            var arrAllSave:ArrayCollection = new ArrayCollection();
            for(var i:int = 0;i<arrAll.length; i++)
            {
                try
                {
                    var tempCon:ConnectImage = arrAll[i];
                    arrAllSave.addItem({item:arrAll[i], type:"ConnectImage" });                             
                }
                catch(er:Error)
                {
                    var tempImage:Image = arrAll[i];
                    var objImage:ClassImage = new ClassImage(arrAll[i]);
                    arrAllSave.addItem({item:objImage, type:"Image" });                 
                }
            }

            // First, generate your ByteArray from the VO.
            var byteArray : ByteArray = new ByteArray();

            byteArray.writeObject( arrAll );

            // Resolve your file location.
            //var file : File = File.applicationStorageDirectory.resolvePath( "testFile.ri" );

            var mapName:String = txtMapTitle.text;

            var file : File = File.applicationStorageDirectory.resolvePath( 'Saved Maps/'+mapName+'.imm' );
            if(file.exists == true)
            {
                lblWarn.text = "Map already Exists. Please enter Defferent Map Title";  
            }
            else if(mapName == "")
            {
                lblWarn.text = "Please enter a title for Map.";
            }
            else
            {                       
                var fileStream:FileStream = new FileStream();
                // Save the file to the given location.
                fileStream.open(file, FileMode.WRITE);
                fileStream.writeBytes( byteArray );
                fileStream.close();

                lblWarn.text = "Map Saved successfully";
            }           

        }

        protected function btnLoadMap_clickHandler(event:MouseEvent):void
        {           

            // Execute the file load.
            var loadFileName:String = "t1"; 
            var request : URLRequest = new URLRequest ( "app-storage:/"+"Saved Maps/"+loadFileName+".imm" );
            var receptor : URLLoader = new URLLoader( request );

            // Make sure our content is interpreted as a ByteArray.
            receptor.dataFormat = URLLoaderDataFormat.BINARY;
            receptor.addEventListener( Event.COMPLETE, fileLoadedHandler );


        }
        private function fileLoadedHandler ( event : Event ) : void
        {
            // Retrieve the event target, cast as the URLLoader we just created
            var loader : URLLoader = event.target as URLLoader;

            // Retrieve the loaded data. We know it's a ByteArray, so let's cast it as well.
            var data : ByteArray = loader.data as ByteArray;

            // Use the ByteArray.readObject method to reconstruct the object.
            var obj : Object = data.readObject();

            // Cast the object and assign it to our data container.

            var loadArrAll:ArrayCollection = obj as ArrayCollection;

        }

最后一行

var loadArrAll:ArrayCollection = obj as ArrayCollection;

这就是问题所在。我得到了数组集合,但它只有一个对象列表,没有图像,也没有我的类对象(虽然这些都在那里,但是当我序列化它时,我发现无法将这个数组集合转换为以前的形式。)

【问题讨论】:

  • 我发现了一些“[远程类别名=(...)]”。像这样的东西谁能告诉我如何使用它来解决我的问题。
  • 嗨,你能放一些示例代码吗?对象在调试模式下是否具有正确的变量?
  • 对于那些您不必自己编写代码的类,并非所有内容都可以自动序列化(您将使用您在注释中添加的 sn-p 注册别名。
  • 嘿 Lukasz 'Severiaan' Grela,你能给出一些代码示例吗?我认为这是一个解决方案。
  • 为什么不在服务器端序列化/反序列化?

标签: actionscript-3 apache-flex serialization amf


【解决方案1】:

需要序列化/反序列化的类需要实现flash.utils.IExternalizable

    public function readExternal(input:IDataInput):void - here you restore object
    public function writeExternal(output:IDataOutput):void - here you saving object

最好的问候

【讨论】:

    【解决方案2】:

    Zain,你必须这样声明你的类:

    package com
    {
        [RemoteClass]
        public class myClass
        {
            public function myClass()
            {
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-25
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多