创建任何桌面应用程序几乎总是需要在本地存储数据,通过Adobe AIR我们有几下面几个选择,一个是我们能够使用内置的 SQLite 数据库支持,对于少量的数据这是大材小用了。另外一个选择是我们通过把数据转换成XML格式,并写入文件中,问题是,如果我们需要一个对象,不得不写一些解码器来转换这个XML。还有另一个选择是在Adobe AIR中,我们序列化一个对象到byte数组,并且写入文件。

好的,我们可以写一个对象到文件中,我们选择那种呢?有两件事情,首先,作为一个byte数组,数组将是非常小的,有利于节省保存空间。最后,我们通过一个或者两个方法来序列化这个类型对象,并且返回类型对象。所以,我们选择最后一种。

在本教程中,我们将在应用程序关闭的时候把用户的一些偏好数据保存起来,在下次程序打开的时候,并重新读取它。所以,让我们先看看后面将要保存文件的这个对象。

package
{
[RemoteClass]
public class UserPrefs
{
public var name:String;
public var appPosX:Number;
public var appPosY:Number;
public var appWidth:Number;
public var appHeight:Number;
}
}

嗯,应该看到上面有个与众不同的地方。[RemoteClass]元数据标签。Adobe对这个元标签有一个很好的描述,在下面:

Use the [RemoteClass] metadata tag to register
the class with Flex so that Flex preserves
type information when a class instance is serialized by using Action Message Format (AMF).
使用这个[RemoteClass]元标签来注册的flex类来保存类型信息。当这个类的对象被序列化的时候使用AMF通讯协议

主要的,我们序列化这个对象的时候,需要这个标签来确定它的类型。并且阅读这个对象的所有人都可以看出它的类型(像 UserPrefs)。

为了保存这个对象到文件中,我们仅仅需要几行代码就可以了。为了处理这个问题,我创建了一个拥有一些静态方法的类。类名为FileSerializer,将拥有写对象到文件,

读文件到对象的方法。

package com.paranoidferret.util
{
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream; public class FileSerializer
{
public static function writeObjectToFile(object:Object, fname:String):void
{
var file:File = File.applicationStorageDirectory.resolvePath(fname); var fileStream:FileStream = new FileStream();
fileStream.open(file, FileMode.WRITE);
fileStream.writeObject(object);
fileStream.close();
}
}
}

在上面你可能注意到这个方法有两个参数。objectfname ,第一个是写入文件的对象,第二个是写入文件的文件名。方法的第一行是得一个我们将要写入的文件。

我们首先创建了一个FileStream(文件流),并且打开了这个文件的写操作。然后我们使用方法writeObject写这个对象到文件,然后关闭这个文件流。是的,它确实容易。

现在我们能写一个对象到文件,我们也应该创建一个方法来阅读这个文件。下面是一个完整的FileSerializer 类,我们添加了一个新的方法。

package com.paranoidferret.util
{
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream; public class FileSerializer
{
public static function writeObjectToFile(object:Object, fname:String):void
{
var file:File = File.applicationStorageDirectory.resolvePath(fname); var fileStream:FileStream = new FileStream();
fileStream.open(file, FileMode.WRITE);
fileStream.writeObject(object);
fileStream.close();
} public static function readObjectFromFile(fname:String):Object
{
var file:File = File.applicationStorageDirectory.resolvePath(fname); if(file.exists) {
var obj:Object;
var fileStream:FileStream = new FileStream();
fileStream.open(file, FileMode.READ);
obj = fileStream.readObject();
fileStream.close();
return obj;
}
return null;
}
}
}

读对象的方法基本遵循同样的流程,除了它从文件读对象的方法readObject,然后关闭流,并返回这个对象。如果不能读取这个文件,或者文件中的数据不正确,readObject将抛出一个error。如果你想处理这里,可以try catch这块。

接下来,让我们看看如何使用它,我们构建一个应用程序,需要记住你最后一次打开它的状态。我们从上面的对象很容易做这样的事情,它甚至可能看起来像下面这样。

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication
xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
width="300" height="200"
creationComplete="init()"
closing="closing()">
<mx:Script>
<![CDATA[
import com.paranoidferret.util.FileSerializer; private var up:UserPrefs; private function init():void
{
this.up = FileSerializer.readObjectFromFile("prefs.up") as UserPrefs;
if(up) {
this.nativeWindow.x = up.appPosX;
this.nativeWindow.y = up.appPosY;
this.nativeWindow.width = up.appWidth;
this.nativeWindow.height = up.appHeight;
this.nativeWindow.title = up.name;
} else {
this.up = new UserPrefs();
}
} private function closing():void
{
this.up.name = "The Fattest";
this.up.appPosX = this.nativeWindow.x;
this.up.appPosY = this.nativeWindow.y;
this.up.appWidth = this.nativeWindow.width;
this.up.appHeight = this.nativeWindow.height;
FileSerializer.writeObjectToFile(this.up, "prefs.up");
}
]]>
</mx:Script>
</mx:WindowedApplication>

在上面的代码中,我们检查是否有用户的喜好。在creationComplete 里读取文件。如果我们得到了返回的Object ,然后把它转换为UserPrefs  ,然后从文件里更新应用程序的nativeWindow大小和位置。

Adobe AIR and Flex - 保存序列化对象文件(译)的更多相关文章

  1. Adobe AIR and Flex - 实现堆栈容器

    1.需求描述: 在对云平台的监控中,我们经常需要在一张图上可视化的描述集群下的物理机所虚拟的虚拟机使用情况,以及超卖情况.那么传统的chart图就不满足我们的需求了,那么要实现这样一个定制化的char ...

  2. Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表,以及同步和异步执行模式)

    系列文章导航 Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表) Adobe AIR中使用Flex连接Sqlite数据库(2)(添加,删除,修改以及语句参数) Adobe ...

  3. cPickle对python对象进行序列化,序列化到文件或内存

    pickle模块使用的数据格式是python专用的,并且不同版本不向后兼容,同时也不能被其他语言说识别.要和其他语言交互,可以使用内置的json包 cPickle可以对任意一种类型的python对象进 ...

  4. C#程序将对象保存为json文件的方法

    首先,从NuGet上下载JSON .Net,安装到所需项目中. 对象obj保存到文件的步骤: 1. 创建文件 // 获取当前程序所在路径,并将要创建的文件命名为info.json string fp ...

  5. C# 持续序列化对象追加到文件的方法

    最近有个需求,将内存和帧数数据序列化到二进制文件.为了节省内存,采用了100个对象的数组,每次存满就序列化到文件,然后归零继续存,以追加的性式继续序列化到原有文件. 这样相当于多个数组对象存在了同一个 ...

  6. C++ 基于STL的演讲比赛流程管理系统(sort算法+小型算法(accumulate)+内建函数对象+string字符串拼接+字符串截取+多个容器基础操作+与用户交互+文件的读写+保存+重建+整体文件数据的清空)

    1 /* 2 比赛规则: 3 学校举行一演讲比赛,共12个人参加,比赛两轮,第一轮为淘汰赛 第二轮为决赛 4 每名选手都有对应的编号:如10001~10012 5 比赛方式:分组比赛 每组6人 6 第 ...

  7. 如何将Python对象保存在本地文件中?

    Python对象的永久存储 1.使用Python的pickle模块 import pickle class A: def __init__(self,name,a): self.name=name s ...

  8. [转]Flash Player、AIR、Flex SDK 大全

    平时不断看到有朋友在各种论坛.空间.知道.群里求 Flash 平台各种版本的运行时(Flash Player)和SDK(Flex.AIR).今天就看到不下10次!所以决定把 Macromedia.Ad ...

  9. 开发Adobe AIR移动应用程序的考虑事项

    http://www.adobe.com/cn/devnet/air/articles/considerations-air-apps-mobile.html Adobe AIR 经过发展演进,已经超 ...

随机推荐

  1. Codeforces 675B Restoring Painting

    链接:传送门 题意:给出3 × 3的方块,其中任意2 × 2的方块和左上角2 × 2的和相等,还给出9个格子中的4个--a,b,c,d ,在1~n中选择一些数(可重复)填入剩下5个格子中,问有多少种填 ...

  2. mysql局域网服务搭建

    首先配置电脑Mysql环境变量 新建 Mysql服务配置 CMD >命令 : mysql -u root -p 4. 创建用户 Mysql 用户权限分配 5 重启服务 如果还不能访问就一定是你的 ...

  3. 变量命名规范及str类型

    变量命名规范: 1.单词之间用_分开 add_num() 2.全局变量,大写 PI,NUMBER() 3.实例变量,以_开头 _example() 4.私有实例变量 __private() 5.普通函 ...

  4. hive用mysql作元数据代替默认derby的hive-site.xml配置

    <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://s ...

  5. Maven系列--web.xml 配置详解

    一 .web.xml介绍 启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 紧接着,容 ...

  6. HDU1061_Rightmost Digit【高速幂取余】

    Rightmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. Linux网络编程(附1)——封装read、write

    原打算实践简单的模型的时候,主要专注于基本的模型,先用UNIX I/O糊弄下,可是未封装的read和write用起来实在心累,还是直接用前辈们已经实现好的高级版本号read.write. UNIX I ...

  8. php设计模式之责任链模式

    php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...

  9. Linux就该这么学 20181005(第八章防火墙)

    参考链接https://www.linuxprobe.com/ vim /etc/sysconfig/network-scripts/ifcfg-ens32 网络配置0 nmtui 网络配置1 nm- ...

  10. MyLayer MyScene

    //MyLayer.h #include "cocos2d.h" USING_NS_CC; class MyLayer : public CCLayer { public: sta ...