创建任何桌面应用程序几乎总是需要在本地存储数据,通过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. anshi

    env.js主要是帮助我们读取根目录下以.env开头的环境变量,并判断是否生效. 比如在根目录下创建一个.env.local文件 改写一个环境变量 而没有改之前,它是在3000端口打开 path.js ...

  2. NOI 2016 优秀的拆分 (后缀数组+差分)

    题目大意:给你一个字符串,求所有子串的所有优秀拆分总和,优秀的拆分被定义为一个字符串可以被拆分成4个子串,形如$AABB$,其中$AA$相同,$BB$相同,$AB$也可以相同 作为一道国赛题,95分竟 ...

  3. 详解 QT 主要类 QWidget

    QWidget类是所有用户界面对象的基类,每一个窗口部件都是矩形,并且它们按Z轴顺序排列的.一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分. 先来看内容. AD: 2013云计算架构师 ...

  4. Svn 提交新文件

    1.右击文件: 2.按图做:

  5. JavaScript中的基础测试题

                                                                                                    Java ...

  6. 2015 Multi-University Training Contest 5 hdu 5352 MZL's City

    MZL's City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  7. 继承QWidget的派生类控件不能设置QSS问题解决(使用style()->drawPrimitive(QStyle::PE_Widget,也就是画一个最简单最原始的QWidget,不要牵扯其它这么多东西)

    自定义控件时基类用了QWidget,发现qss设置不起作用,需要重载其paintEvent函数即可: 如下代码: void CCustomWidget::paintEvent(QPaintEvent* ...

  8. GitBlit中出现 error: remote unpack failed: error Missing tree

    clu@WASYGSHA01-1020 MINGW64 /d/ChuckLu/Git/Edenred/LISA_5.0.0.0 (local)$ git push origin preaction:p ...

  9. java语言体系的技术简介之JSP、Servlet、JDBC、JavaBean(Application)

    转自:https://zhangkunnan.iteye.com/blog/2040462 前言 Java语言 Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.Servlet. ...

  10. javascript对象的相关操作

    Window对象 我们知道浏览器对象模型(BOM)是javascript的组成之一,它提供了独立于内容与浏览器窗口进行交互的对象.其分层结构如下: window对象是整个BOM的核心其有documen ...