1

Flash Builder 4.7、AIR 3.5、Flex 4.6.0 (ビルド 23201) の最終リリースを使用し、iOS 6.0.1 (10A523) を実行する iPad2 MC981LL に対して fast-build を実行/デバッグする

私は、かなり単純であるべきだと考えるべきことのために 1 日以上を無駄にしましたが、この時点で完全に途方に暮れています。どんな助けでも感謝します。

エラーメッセージは表示されません。これが実行された後、ファイルは存在しますが、サイズはわずか 128 バイトです。言うまでもなく、NULL 以外として読み込むことはできません。問題を引き起こしているのがより複雑なオブジェクトではないことを確認するためだけに、writeObject 関数で Object() をインスタンス化しました (簡単にするために、bitmapData とサムネイルのプロパティを一時的に空白のままにしました)。サイコロはありません。

オブジェクトを読み返す試みを除いて、関連するすべてのコードを含めました。

言うまでもなく、これは読み取り機能と書き込み機能を備えた単純なクラスとして始まり、なぜ失敗したのかについて使用可能な情報を取得しようとするにつれて、より複雑になりました。もともと、トレース ステートメント、カスタム イベント、ディスパッチャー、try、catch、finally、イベント リスナーなど、手がかりとなるものは何もありませんでした。

また、ボール全体を転がすクラスのstatusMessage(下部の最後のコードブロック)に「画像とサムネイルをライブラリに保存中」と表示されるため、カスタムイベント/ハンドラー/リスナー/ディスパッチャー全体が間違っている可能性がありますが、決して「ライブラリに保存されたファイル」

どんな助けでも大歓迎です。

これが私のトレースです:

[SWF] PictureToolsOnTheMoveMakeIt.swf - 4,154,904 bytes after decompression
FileSerializer FUNCTION writeObjectToFile()
FileStream.openAsync(write) finally
FileStream.writeError() finally

FileSerializer クラス:

package classes
{
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IEventDispatcher;
    import flash.events.IOErrorEvent;
    import flash.errors.*;
    import flash.filesystem.File;
    import flash.filesystem.FileMode;
    import flash.filesystem.FileStream;

    import events.FileSerializerEvent;

    import vo.PTotmImageVO;

    [Event(name = "writeComplete", type = "events.FileSerializerEvent")]
    [Event(name = "readComplete", type = "events.FileSerializerEvent")]

    public class FileSerializer extends EventDispatcher
    {
        private var fileStream:FileStream = new FileStream();

        public function FileSerializer(target:IEventDispatcher=null)
        {
            super(target);
        } // End CONSTRUCTOR FileSerializer

        public function writeObjectToFile(ptotmImageVO:PTotmImageVO, fnam    e:String):void
        {
            trace("FileSerializer FUNCTION writeObjectToFile()");
            var file:File = File.applicationStorageDirectory.resolvePath(ptotmImageVO.userid+"-"+ptotmImageVO.timestamp+".PTotmImageVO");

            fileStream.addEventListener(Event.CLOSE, close);
            fileStream.addEventListener(IOErrorEvent.IO_ERROR, ioErrorEventHandler);

            try
            {
                fileStream.openAsync(file, FileMode.WRITE);
            }
            catch (e:SecurityError)
            {
                // The file location is in the application directory, and the fileMode parameter is set to "append",
                // "update", or "write" mode.

                trace("FileStream.openAsync(write) SecurityError "+e);
            }
            finally
            {
                trace("FileStream.openAsync(write) finally");
            }

            try
            {
                fileStream.writeObject(ptotmImageVO);
            }
            catch (e:IOError)
            {
                // The file has not been opened; the file has been opened, but it was not opened with write capabilities;
                // or for a file that has been opened for synchronous operations (by using the open() method), the file
                // cannot be written (for example, because the file is missing).
                trace("FileStream.writeObject() IOError "+e);
            }           
            finally
            {
                trace("FileStream.writeObject() finally");
            }
        } // End FUNCTION writeObjectToFile

        protected function close(e:Event):void
        {
            trace("FileSerializer FUNCTION close()");
            dispatchEvent(new FileSerializerEvent(FileSerializerEvent.WRITE_COMPLETE, null,true,true));
        } // End FUNCTION close

        protected function ioErrorEventHandler(event:Event):void
        {
            trace("FileSerializer FUNCTION ioErrorEventHandler()");
        } // End FUNCTION ioErrorEventHandler

        public function readObjectFromFile(fname:String):Object
        {
            var file:File = File.applicationStorageDirectory.resolvePath(fname);

            if(file.exists)
            {
                var obj:Object;
                var fileStream:FileStream = new FileStream();
                fileStream.addEventListener(Event.COMPLETE, readComplete);
                fileStream.open(file, FileMode.READ);
                obj = fileStream.readObject();
                fileStream.close();
                return obj;
            }
            return null;
        } // End FUNCTION readObjectFromFile

        protected function readComplete(event:Event):void
        {
            dispatchEvent(new FileSerializerEvent(FileSerializerEvent.READ_COMPLETE, event.target));            
        } // End FUNCTION readComplete
    } // End CONSTRUCTOR FileSerializer
} // End PACKAGE classes

ValueObject クラス:

package vo
{
    import flash.display.BitmapData;

    [remoteClass(alias="PTotmImageVO")]

    public class PTotmImageVO
    {
        public var userid:String;
        public var thumbnail:BitmapData;
        public var image:BitmapData;
        public var timestamp:Number;
        public var description:String;
        public var type:String;

        public function PTotmImageVO()
        {

        } // End Constructor PTotmImageVO
    } // End Class PTotmImageVO
} // End Package vo

イベント クラス FileSerializerEvent:

package events
{
    import flash.events.Event;

    public class FileSerializerEvent extends Event
    {
        public static const WRITE_COMPLETE:String = "writeComplete";
        public static const READ_COMPLETE:String = "readComplete";

        public function FileSerializerEvent(type:String, data:*=null, bubbles:Boolean = true, cancelable:Boolean = true)
        {
            super(type, bubbles, cancelable);

            switch(type)
            {
                case WRITE_COMPLETE:
                    break;
                case READ_COMPLETE:
                    break;
            }
        }
    }
}

最後に、オブジェクトを作成し、クラスをインスタンス化し、作成したオブジェクトを使用してクラスの writeObjectToFile() 関数を呼び出すコード:

            private var ptotmImageVO:PTotmImageVO = new PTotmImageVO();
            private var fileSerializer:FileSerializer = new FileSerializer();

            protected function createThumbnail():void
            {
                thumbBmpData = ImageResizer.bilinearIterative(bmpData, borderRect.width, borderRect.height, ResizeMath.METHOD_LETTERBOX , true, 3);

                saveImageToLibrary();
            }

            protected function saveImageToLibrary():void
            {
                statusMessage.text = "Saving Image and Thumbnail to Library...";

                ptotmImageVO.userid = parentApplication.userid;
                ptotmImageVO.description = "";
                ptotmImageVO.timestamp = new Date().getTime();
//              ptotmImageVO.thumbnail = thumbBmpData;
//              ptotmImageVO.image = bmpData;
                ptotmImageVO.type = "PictureTools - On The Move - Photo Entity";

                    fileSerializer.addEventListener(FileSerializerEvent.WRITE_COMPLETE, saveComplete);
                fileSerializer.writeObjectToFile(ptotmImageVO, ptotmImageVO.userid+"-"+ptotmImageVO.timestamp+".PTotmImageVO");
            }

            protected function saveComplete(event:FileSerializerEvent):void
            {
                statusMessage.text = "File Saved to Library";
            }

まぁ。すべての情報を提供することもできます。これは、itemRenderer を使用してオブジェクトをタイル レイアウトに表示することを計画しているため、オブジェクトを読み込もうとしているクラスです (うまくいけば、Apache Flex 4.9 の新しい DataGrid がすぐに)...

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark"
         creationComplete="drawBackground()"
         click="refreshFileListing()">

    <fx:Script>
        <![CDATA[
            import spark.components.VGroup;

            import classes.FileSerializer;          
            import events.FileSerializerEvent;
            import vo.PTotmImageVO;

            [Bindable]
            private var file:File = File.applicationStorageDirectory;
            [Bindable]
            private var directoryListing:String = new String();

            private var files:Array;
            private var fs:FileSerializer = new FileSerializer();


            public function refreshFileListing():void
            {               
                files = file.getDirectoryListing();

                trace("MyLibraryPhotoPanel FUNCTION refreshFileListing -- file.nativePath -- "+file.nativePath);
                trace("MyLibraryPhotoPanel FUNCTION refreshFileListing -- file.isDirectory -- "+file.isDirectory);
                trace("MyLibraryPhotoPanel FUNCTION refreshFileListing -- file.name -- "+file.name);
                trace("MyLibraryPhotoPanel FUNCTION refreshFileListing -- file.getDirectoryListing -- "+file.getDirectoryListing());
                trace("MyLibraryPhotoPanel FUNCTION refreshFileListing -- files.length -- "+files.length);

            var objects:Array = new Array();

                for (var i:uint = 0; i < files.length; i++)
                {
                    fs.addEventListener(FileSerializerEvent.READ_COMPLETE, fileReadComplete);

                    var f:String = files[i].name;
                    var o:PTotmImageVO = fs.readObjectFromFile(f) as PTotmImageVO;
                    objects.push(o); // Desperate at this point pretty much trying nonsense

                    trace("MyLibraryPhotoPanel FUNCTION refreshFileListing in for() -- o -- "+o);

                    // This is destined for an itemRenderer if ever I can get an object serialized to file and read back in.
//                  var b:BitmapData = o.thumbnail as BitmapData;
//
//                  var img:Image = new Image();
//                  img.source = b;
//
//                  var l:Label = new Label();
//                  l.text = files[i].name;
//
//                  var vg:VGroup = new VGroup();
//                  vg.addElement(img);
//                  vg.addElement(l);
//
//                  tg.addElement(vg);              

                    trace("MyLibraryPhotoPanel FUNCTION refreshFileListing in for()#1 -- count/name/size -- "+i+". "+files[i].name+" "+files[i].size+"bytes");
                }

                for(var k:uint = 0; k<objects.length; k++)
                {
                    trace("MyLibraryPhotoPanel FUNCTION refreshFileListing in for()#2 -- file object in Array -- "+k+". "+objects[k]);
                }
            } // End FUNCTION refreshFileListing

            protected function fileReadComplete(event:FileSerializerEvent):void
            {
                trace("MyLibraryPhotoPanel FUNCTION FileReadComplete");
            } // End FUNCTION fileReadComplete

            protected function drawBackground():void
            {
                with(graphics)
                {
                    beginFill(0xffffff,0);
                    drawRect(0,0,parent.width,parent.height);
                    endFill();
                }
            } // End FUNCTION drawBackground

        ]]>
    </fx:Script>
    <s:VGroup id="tg" height="100%" width="100%">
    </s:VGroup> 
</s:Group>

そしてトレース出力:

[SWF] PictureToolsOnTheMoveMakeIt.swf - 4,152,506 bytes after decompression
FileSerializer FUNCTION writeObjectToFile()
FileStream.openAsync(write) finally
FileStream.writeObject() finally
FileSerializer FUNCTION writeObjectToFile()
FileStream.openAsync(write) finally
FileStream.writeObject() finally
MyLibraryPhotoPanel FUNCTION refreshFileListing -- file.nativePath -- /var/mobile/Applications/926FFAF1-3FBE-4854-A61C-3BB8A3752D50/Library/Application Support/org.PictureTools.Apps.PictureToolsOnTheMoveMakeIt.debug/Local Store
MyLibraryPhotoPanel FUNCTION refreshFileListing -- file.isDirectory -- true
MyLibraryPhotoPanel FUNCTION refreshFileListing -- file.name -- Local Store
MyLibraryPhotoPanel FUNCTION refreshFileListing -- file.getDirectoryListing -- [object File],[object File]
MyLibraryPhotoPanel FUNCTION refreshFileListing -- files.length -- 2
MyLibraryPhotoPanel FUNCTION refreshFileListing in for() -- o -- null
MyLibraryPhotoPanel FUNCTION refreshFileListing in for()#1 -- count/name/size -- 0. 000000-1357831345565.PTotmImageVO 117bytes
MyLibraryPhotoPanel FUNCTION refreshFileListing in for() -- o -- null
MyLibraryPhotoPanel FUNCTION refreshFileListing in for()#1 -- count/name/size -- 1. 000000-1357831356829.PTotmImageVO 117bytes
MyLibraryPhotoPanel FUNCTION refreshFileListing in for()#2 -- file object in Array -- 0. null
MyLibraryPhotoPanel FUNCTION refreshFileListing in for()#2 -- file object in Array -- 1. null
4

1 に答える 1

1

解決しました。Metadata タグは [RemoteClass... ではなく [remoteClass] であり、私が作業を開始したサンプル コードに示されています。コンパイラはこれらのタグをチェックせず、独自のタグを作成することは技術的にエラーではないため、動作する診断データは決してありません。

于 2013-01-22T20:00:53.957 に答える