Actionscript 3 将应用程序状态保存在磁盘或其他位置,以便用户稍后访问

Actionscript 3 将应用程序状态保存在磁盘或其他位置,以便用户稍后访问,actionscript-3,apache-flex,flex4,flex4.6,Actionscript 3,Apache Flex,Flex4,Flex4.6,在flex builder 4.5中,我正在做一个类似的项目。 在关闭应用程序之前,我想保存图表(显示对象、ui组件、文本),而在应用程序再次打开后,我将无法访问这些图表 更清楚:-如果用户在此项目上编辑一些uml图,并将其保存以供以后编辑,然后关闭应用程序。几天后,他/她希望编辑先前保存的图。 现在我将如何保存此图表以供将来编辑 您可以通过SharedObject存储您的图表状态,以便更好地创建一个包含所有图表状态的类,以便以后可以使用 共享对象使用 您可以对存储在sharedobject中的

在flex builder 4.5中,我正在做一个类似的项目。 在关闭应用程序之前,我想保存
图表(显示对象、ui组件、文本)
,而在应用程序再次打开后,我将无法访问这些图表

更清楚:-如果用户在此项目上编辑一些uml图,并将其保存以供以后编辑,然后关闭应用程序。几天后,他/她希望编辑先前保存的图。

现在我将如何保存此图表以供将来编辑

您可以通过SharedObject存储您的图表状态,以便更好地创建一个包含所有图表状态的类,以便以后可以使用

共享对象使用

您可以对存储在sharedobject中的自定义类使用
registerClassAlias

myClassInstance = new MyClass();
myClassInstance.x = 100;
myClassInstance.y = 100;
myClassInstance.text = "diagrams";

registerClassAlias("com.path.to.MyClass", MyClass);
myStuff = SharedObject.getLocal("myAppStuff");
myStuff.data.whatINamedIt = myClassInstance;
myStuff.flush();
现在当你把它拿出来的时候。。。你可以说:

myStuff = SharedObject.getLocal("myAppStuff");
var mySavedClass:MyClass = myStuff.data.whatINamedIt as MyClass;
读取mySavedClass实例值,然后在再次打开时注入到图表模型中

实现应用程序关闭事件


如果“保存/打开”对话框适合您,您可以使用
FileReference
API。在执行此操作之前,您必须将状态序列化/反序列化到
String
/
ByteArray
/
XML
对象中

private var fileReference:FileReference;

// due to security restrictions, this method must be called from an
// event handler that responds to a user event (mouse click or key
// press), otherwise it will fail.

private function saveState(serializedState:*, fileName:String):void {
    fileReference = new FileReference();

    fileReference.addEventListener(Event.COMPLETE, onSaved);
    fileReference.addEventListener(IOErrorEvent.IO_ERROR, onSavingError);

    try {
        fileReference.save(serializedState, fileName); // will open save dialog
    } catch (e:Error) {
        trace("error saving data: " + e.toString());
        freeListeners();
    }
}

private function onSaved(e:Event):void {
    trace("saved!");
    freeListeners();
}

private function onSavingError(e:ErrorEvent):void {
    trace("error saving data: " + e.toString());
    freeListeners();
}

private function freeListeners():void {
    fileReference.removeEventListener(Event.COMPLETE, onSaved);
    fileReference.removeEventListener(IOErrorEvent.IO_ERROR, onSavingError);
}
与恢复状态类似(然后使用)

如果您需要在没有任何对话框的情况下保存/恢复应用程序状态,那么您可能应该使用AIR(或Raja Jaganathan建议的
SharedObject
)。但情况似乎并非如此,因为您希望用户能够在另一个系统中重新打开图表。为了实现这一点,您应该允许用户将其工作保存到适当的位置,以便稍后他可以将其移动到另一台机器/系统,并使用您的应用程序重新打开它


另一种选择是将所有内容存储在服务器上,并向用户提供保存的文件列表(就像Cacoo那样)。如果这样做,则必须实现相应的服务器端API。它可以是RESTAPI或类似smth的RTMP服务器。对于REST API,请使用
FileReference.upload()
将数据上载到服务器,并使用
urloader.load()
将数据获取回来。

无法直接序列化Sprite或MovieClip其他DisplayObject对象。因此,您应该存储对象信息(原点x、y、宽度、高度、颜色、子信息…)。使用字节数组、数组或字典。。。并保存到共享对象。稍后从ShareObject回滚并重新创建原始对象。MovieClip或Sprite的适当用途是容器

这是我的测试代码

1.制作一个电影剪辑。用途是容器。

2.使用图形绘制矩形。并设置坐标。 3.将信息存储在数组中。 4.保存到SharedObjects,数组。 5.这是从存储的SharedObject数据加载。并重新创建对象。
您使用的是Flex或AdobeAIR。感谢您的帮助,我使用的是Flex 4.5 web应用程序,而不是AIRPlease。请为您的问题使用一个有意义的完整标题;您使用的IDE名称以外的其他名称。除此之外,“保存图表”到底是什么意思?保存图片?是否保存应用程序的状态?或者只是其中的一部分。。。请更准确。谢谢raja先生,但是如果用户在另一个系统中打开他/她以前编辑的图表,那么他/她是否能够编辑相同的以前的图表?因为您需要将图表值的状态发送到服务器一段时间(如2分钟)然后,当您的用户再次登录时,从服务器获取这些信息,然后设置为您的模型。如何在服务器上存储此值?用户能否在不同的系统(计算机)上编辑以前编辑的图表?当然,在(任何)另一个系统中,您的应用程序可能正在服务器上运行,那么为什么要担心它呢。通过表存储值,然后在用户登录时返回这些值。我正在将所有图表实例存储在arrayList中,如果我能够将此列表存储在shareObject中,那么我的问题将得到解决。我使用的是flex 4.6 web应用程序。所以不会使用AIR。@raja是正确的,但如果UIComponent死者,我无法复制这些类型的对象。当然可以。但您可以复制状态,而不是复制表示此状态的实际对象。例如,您可以保存图表组件的位置/标签,然后重新创建相应的Flex对象。此外,当您以后要编辑UML diargam时,这是保存UML diargam的唯一正确方法。保存状态,而不是它的表示。我们如何创建相应的对象。我将以基类对象形式获取对象。
var drawWidth:Number = 500;
var drawHeight:Number = 300;

var rect:MovieClip = new MyRect();
rect.graphics.beginFill(0xffffff*Math.random(),1);
rect.graphics.drawRect(0,0,drawWidth,drawHeight);
rect.graphics.endFill();
rect.x= 300;
rect.y= 100;
var myRectInformation:Array = new Array();
myRectInformation.push(rect.x);
myRectInformation.push(rect.y);
myRectInformation.push(drawWidth);
myRectInformation.push(drawHeight);
var bmd:BitmapData = new BitmapData(rect.width, rect.height,true,0);
bmd.draw(rect);
//is byteArray.
myRectInformation.push(bmd.getPixels(new Rectangle(0,0,bmd.width,bmd.height)));
var mySaveData:SharedObject = SharedObject.getLocal("myStorage")
mySaveData.data.myRectInformation = myRectInformation;
mySaveData.flush();
var rect:MovieClip = new MyRect();
var loadBmd:BitmapData = new BitmapData(mySaveData.data.myRectInformation[2], mySaveData.data.myRectInformation[3], true, 1);
loadBmd.setPixels(new Rectangle(0,0,loadBmd.width,loadBmd.height), mySaveData.data.myRectInformation[4]);
var bmp:Bitmap = new Bitmap(loadBmd);
rect.addChild(bmp);
rect.x = mySaveData.data.myRectInformation[0];
rect.y = mySaveData.data.myRectInformation[1];
addChild(rect);