flash.net
public class SharedObject
继承SharedObject Inheritance EventDispatcher Inheritance Object

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

SharedObject 类用于在用户计算机或服务器上读取和存储有限的数据量。使用共享对象,可在永久贮存在本地计算机或远程服务器上的多个客户端 SWF 文件和对象之间实现实时数据共享。本地共享对象类似于浏览器 Cookie,远程共享对象类似于实时数据传输设备。若要使用远程共享对象,您需要 Adobe Flash Media Server。

可使用共享对象执行以下操作:

若要创建本地共享对象,请调用 SharedObject.getLocal()。若要创建远程共享对象,请调用 SharedObject.getRemote()

当应用程序关闭时,将会刷新共享对象或将其写入磁盘。也可以调用 flush() 方法以显式地将数据写入磁盘。

本地磁盘空间注意事项。本地共享对象具有一些限制,这些限制很重要,您在设计应用程序时要予以考虑。有时可能不允许 SWF 文件写入本地共享对象,有时可能会在您不知情的情况下删除在本地共享对象中存储的数据。Flash Player 用户可以管理对单个域或所有域可用的磁盘空间。当用户减少可用磁盘空间时,一些本地共享对象可能会被删除。Flash Player 用户还具有隐私控制能力,它们可防止第三方域(当前浏览器地址栏中域之外的域)读取或写入本地共享对象。

注意:在本地计算机(而不是远程服务器)上存储和运行的 SWF 文件始终可以将第三方共享对象写入磁盘。有关第三方共享对象的详细信息,请参阅“Flash Player 帮助”中的“全局存储设置”面板

最好检查与磁盘空间数量和用户隐私控制有关的故障。在调用 getLocal()flush() 时执行这些检查:

如果您的 SWF 文件尝试创建或修改本地共享对象,请确保 SWF 文件的宽度至少为 215 像素,高度至少为 138 像素,这是用于显示提示用户增加其本地共享对象存储限制的对话框的最小尺寸。如果您的 SWF 文件小于这些尺寸,且需要增加存储限制,则 SharedObject.flush() 失败,返回 SharedObjectFlushedStatus.PENDING,并调度 netStatus 事件。

远程共享对象。如果使用 Flash Media Server,您可以创建并使用远程共享对象,这些对象是由连接到应用程序的所有客户端实时共享的。在一个客户端更改远程共享对象的属性时,也会为所有连接的客户端更改此属性。您可以使用远程共享对象同步客户端,例如,在玩多人游戏的用户。

每个远程共享对象具有一个 data 属性,此对象包含存储数据的属性。可以调用 setProperty() 以更改数据对象的属性。服务器将更新这些属性,调度 sync 事件,并将这些属性发回到连接的客户端。

您可以选择将远程共享对象永久保留在客户端和/或服务器上。默认情况下,Flash Player 最多在本地永久保存 100K 的远程共享对象。在尝试保存较大的对象时,Flash Player 将显示一个“本地存储”对话框,用户可以在其中允许或拒绝共享对象的本地存储。请确保舞台大小至少为 215 x 138 像素;这是 Flash 显示该对话框所需的最小大小。

如果用户选择“允许”,服务器将保存共享对象并调度 code 属性值为 netStatusSharedObject.Flush.Success 事件。如果用户选择“拒绝”,服务器不会保存共享对象并调度 code 属性值为 SharedObject.Flush.FailednetStatus 事件。

查看示例

另请参见

flush()
getLocal()
netStatus


公共属性
 属性定义方
  client : Object
指示对其调用回调方法的对象。
SharedObject
 Inheritedconstructor : Object
对类对象或给定对象实例的构造函数的引用。
Object
  data : Object
[只读 (read-only)] 赋给对象的 data 属性 (property) 的属性 (attribute) 集合;可以共享和存储这些属性 (attribute)。
SharedObject
  defaultObjectEncoding : uint
[静态] 在 SWF 文件中创建的所有本地共享对象的默认对象编码(AMF 版本)。
SharedObject
  fps : Number
[只写] 指定每秒钟客户端对共享对象所做的更改被发送到服务器的次数。
SharedObject
  objectEncoding : uint
此共享对象的对象编码(AMF 版本)。
SharedObject
 Inheritedprototype : Object
[静态] 对类或函数对象的原型对象的引用。
Object
  size : uint
[只读 (read-only)] 共享对象的当前大小(以字节为单位)。
SharedObject
公共方法
 方法定义方
 Inherited
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。
EventDispatcher
  
对于本地共享对象,清除所有数据并从磁盘删除共享对象。
SharedObject
  
关闭远程共享对象和服务器间的连接。
SharedObject
  
connect(myConnection:NetConnection, params:String = null):void
通过指定的 NetConnection 对象连接到服务器上的远程共享对象。
SharedObject
 Inherited
将事件调度到事件流中。
EventDispatcher
  
flush(minDiskSpace:int = 0):String
将本地永久共享对象立即写入本地文件。
SharedObject
  
getLocal(name:String, localPath:String = null, secure:Boolean = false):SharedObject
[静态] 返回对本地永久保留的共享对象的引用,该对象只能用于当前客户端。
SharedObject
  
getRemote(name:String, remotePath:String = null, persistence:Object = false, secure:Boolean = false):SharedObject
[静态] 返回对 Flash Media Server 上可由多个客户端访问的共享对象的引用。
SharedObject
 Inherited
检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。
EventDispatcher
 Inherited
指示对象是否已经定义了指定的属性。
Object
 Inherited
指示 Object 类的实例是否在指定为参数的对象的原型链中。
Object
 Inherited
指示指定的属性是否存在、是否可枚举。
Object
 Inherited
removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
从 EventDispatcher 对象中删除侦听器。
EventDispatcher
  
send(... arguments):void
向连接到远程共享对象的所有客户端广播一条消息(包括发送该消息的客户端)。
SharedObject
  
setDirty(propertyName:String):void
通知服务器共享对象中的属性值已更改。
SharedObject
  
setProperty(propertyName:String, value:Object = null):void
更新共享对象中某个属性的值,并通知服务器该属性的值已更改。
SharedObject
 Inherited
设置循环操作动态属性的可用性。
Object
 Inherited
返回指定对象的字符串表示形式。
Object
 Inherited
返回指定对象的原始值。
Object
 Inherited
检查是否用此 EventDispatcher 对象或其任何始祖为指定事件类型注册了事件侦听器。
EventDispatcher
事件
 事件 摘要 定义方
 Inherited[广播事件] Flash Player 或 AIR 应用程序获得操作系统焦点并变为活动状态时将调度此事件。EventDispatcher
  在异步引发异常(即来自本机异步代码)时调度。SharedObject
 Inherited[广播事件] Flash Player 或 AIR 应用程序失去操作系统焦点并变为非活动状态时将调度此事件。EventDispatcher
  在 SharedObject 实例报告其状态或错误情况时调度。SharedObject
  在服务器更新了远程共享对象后调度。SharedObject
属性详细信息
client属性
client:Object  [读写]

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

指示对其调用回调方法的对象。默认对象为 this。您可以将此客户端属性设置为其它对象,并对此对象调用回调方法。



实现
    public function get client():Object
    public function set client(value:Object):void

引发
TypeError — 必须将 client 属性设置为非空对象。
data属性 
data:Object  [只读 (read-only)]

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

赋给对象的 data 属性 (property) 的属性 (attribute) 集合;可以共享和存储这些属性 (attribute)。每个特性都可以是任何 ActionScript 或 JavaScript 类型的对象(数组、数字、布尔值、字节数组、XML,等等)。例如,下面几行将值赋给共享对象的不同方面:

var items_array:Array = new Array(101, 346, 483);
     var currentUserIsAdmin:Boolean = true;
     var currentUserName:String = "Ramona";
     
     var my_so:SharedObject = SharedObject.getLocal("superfoo");
     my_so.data.itemNumbers = items_array;
     my_so.data.adminPrivileges = currentUserIsAdmin;
     my_so.data.userName = currentUserName;
     
     for (var prop in my_so.data) {
       trace(prop+": "+my_so.data[prop]);
     }
var items_array = new Array(101, 346, 483);
  var currentUserIsAdmin = true;
  var currentUserName = "Ramona";
  
  var my_so = air.SharedObject.getLocal("superfoo");
  my_so.data.itemNumbers = items_array;
  my_so.data.adminPrivileges = currentUserIsAdmin;
  my_so.data.userName = currentUserName;
  
  for (var prop in my_so.data) {
    trace(prop+": "+my_so.data[prop]);
  }

如果对象是永久的,将保存共享对象的 data 属性 (property) 的所有属性 (attribute),共享对象包含以下信息:

userName: Ramona
     adminPrivileges: true
     itemNumbers: 101,346,483

注意:切勿将值直接赋给共享对象的 data 属性,如同在 so.data = someValue 中一样;Flash Player 将忽略这些赋值。

若要删除本地共享对象的属性,请使用诸如 delete so.data.attributeName 这样的代码;将本地共享对象的属性设置为 nullundefined 不会删除该属性。

若要为共享对象创建私有 值(该对象正在使用时只有客户端实例才可以使用该值,并且该值在对象关闭时不与该对象存储在一起),请创建名称不是 data 的属性来存储它们,如下例所示:

var my_so:SharedObject = SharedObject.getLocal("superfoo");
     my_so.favoriteColor = "blue";
     my_so.favoriteNightClub = "The Bluenote Tavern";
     my_so.favoriteSong = "My World is Blue";
     
     for (var prop in my_so) {
       trace(prop+": "+my_so[prop]);
     }
var my_so = air.SharedObject.getLocal("superfoo");
  my_so.favoriteColor = "blue";
  my_so.favoriteNightClub = "The Bluenote Tavern";
  my_so.favoriteSong = "My World is Blue";
  
  for (var prop in my_so) {
    trace(prop+": "+my_so[prop]);
  }

共享对象包含以下数据:

favoriteSong: My World is Blue
     favoriteNightClub: The Bluenote Tavern
     favoriteColor: blue
     data: [object Object]

对于用于服务器的远程共享对象,data 属性 (property) 的所有属性 (attribute) 可供连接到共享对象的所有客户端使用;如果永久保留这些对象,则会保存所有属性 (attribute)。如果一个客户端更改了属性的值,所有客户端可以立即看到新的值。



实现
    public function get data():Object

另请参见

defaultObjectEncoding属性 
defaultObjectEncoding:uint  [读写]

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

在 SWF 文件中创建的所有本地共享对象的默认对象编码(AMF 版本)。在将本地共享对象写入磁盘时,SharedObject.defaultObjectEncoding 属性将指示应使用的 Action Message Format 的版本:ActionScript 3.0 格式 (AMF3)、ActionScript 1.0 还是 2.0 格式 (AMF0)。

关于对象编码的详细信息(包括本地和远程共享对象编码的差异),请参阅 objectEncoding 属性的描述。

SharedObject.defaultObjectEncoding 的默认值设置为使用 ActionScript 3.0 格式 (AMF3)。如果要创建 ActionScript 2.0 或 1.0 SWF 文件可以读取的本地共享对象,则应在创建任何本地共享对象之前,在脚本起始处将 SharedObject.defaultObjectEncoding 设置为使用 ActionScript 1.0 或 ActionScript 2.0 格式 (flash.net.ObjectEncoding.AMF0)。随后创建的所有本地共享对象都将使用 AMF0 编码,并可与旧内容交互。本地共享对象创建后,将无法通过设置 SharedObject.defaultObjectEncoding 来更改现有本地共享对象的 objectEncoding 值。

若要以每个对象为基础设置对象编码,而不是为 SWF 文件创建的所有共享对象设置对象编码,则应设置本地共享对象的 objectEncoding 属性。



实现
    public static function get defaultObjectEncoding():uint
    public function set defaultObjectEncoding(value:uint):void

另请参见

fps属性 
fps:Number  [只写]

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

指定每秒钟客户端对共享对象所做的更改被发送到服务器的次数。

如果希望控制客户端与服务器之间的通信量,可以使用此方法。例如,如果客户端与服务器之间的连接相对较慢,可以将 fps 设置为一个相对较小的值。相反,如果客户端连接到一个对时间具有高要求的多用户应用程序,可能需要将 fps 设置为一个相对较大的值。

设置 fps 将触发 sync 事件并更新对服务器的所有更改。如果只想手动更新服务器,可将 fps 为 0。

在调度 sync 事件之前,不会将更改发送给服务器。也就是说,如果服务器的响应时间较慢,向服务器发送更新的频率则可能小于此属性中的指定值。



实现
    public function set fps(value:Number):void
objectEncoding属性 
objectEncoding:uint  [读写]

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

此共享对象的对象编码(AMF 版本)。在将本地共享对象写入磁盘时,objectEncoding 属性将指示应使用的 Action Message Format 的版本:ActionScript 3.0 格式 (AMF3)、ActionScript 1.0 还是 2.0 格式 (AMF0)。

根据共享对象是本地还是远程来执行不同的对象编码操作。



实现
    public function get objectEncoding():uint
    public function set objectEncoding(value:uint):void

引发
ReferenceError — 您尝试为某个远程共享对象设置 objectEncoding 属性值。对于远程共享对象而言,此属性为只读,因为其值由关联的 NetConnection 实例决定。

另请参见

size属性 
size:uint  [只读 (read-only)]

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

共享对象的当前大小(以字节为单位)。

Flash 通过逐一计算共享对象的每个数据属性计算该对象的大小;对象具有的数据属性越多,评估其大小所花的时间就越长。评估对象大小可能要耗费相当长的处理时间,因此,除非您对它具有特定的需要,否则您可能希望避免使用此方法。



实现
    public function get size():uint

另请参见


示例
以下代码使用 ID "thehobbit" 创建 SharedObject 对象。将名为 username 的属性添加到 SharedObject 对象的数据属性中。然后跟踪 size 属性,这将返回指示的值。
import flash.net.SharedObject;

// if these get copied or not
var mySo:SharedObject = SharedObject.getLocal("thehobbit");
mySo.data.username = "bilbobaggins";
trace(mySo.size); // 55
方法详细信息
clear()方法
public function clear():void

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

对于本地共享对象,清除所有数据并从磁盘删除共享对象。对共享对象的引用仍然处于活动状态,但其数据属性被删除。

对于用于 Flash Media Server 的远程共享对象,clear() 将断开该对象并清除所有数据。如果在本地永久保留了共享对象,此方法还会从磁盘中删除该共享对象。对共享对象的引用仍然处于活动状态,但其数据属性被删除。


示例

以下代码使用值为 hostName 的 ID 创建(并在后续执行过程中检索)一个 SharedObject 对象。将名为 username 的属性添加到 SharedObject 对象的数据属性中。最后调用 clear() 方法,以清除添加到数据对象的所有信息(在本例中是一个名为 username 属性)。
package {
    import flash.net.SharedObject;

    public class SharedObject_clear {
        private var hostName:String = "yourDomain";
        private var username:String = "yourUsername";

        public function SharedObject_clear() {
            var mySo:SharedObject = SharedObject.getLocal(hostName);
            if(mySo.data.username == null) {
                mySo.data.username = username;
                trace("set: " + mySo.data.username); // yourUsername
            }
            else {
                mySo.clear();
                trace("cleared: " + mySo.data.username); // undefined
            }
        }
    }
}
close()方法 
public function close():void

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

关闭远程共享对象和服务器间的连接。如果一个远程共享对象永久储存在本地,那么在此方法被调用后,用户可以对该对象的本地副本进行更改。对本地对象的任何更改都将在用户下一次连接到远程共享对象时发送给服务器。

connect()方法 
public function connect(myConnection:NetConnection, params:String = null):void

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

通过指定的 NetConnection 对象连接到服务器上的远程共享对象。应在调用 getRemote() 后使用此方法。在连接成功时,将调度 sync 事件。

在尝试使用远程共享对象时,应先使用 try..catch..finally 语句。接着,侦听并处理 sync 事件,然后再对共享对象进行更改。在调度 sync 事件之前,进行的任何本地更改可能会丢失。

可以调用 connect() 方法以连接到远程共享对象,例如:

var myRemoteSO:SharedObject = SharedObject.getRemote("mo", myNC.uri, false);
     myRemoteSO.connect(myNC);
var myRemoteSO = air.SharedObject.getRemote("mo", myNC.uri, false);
  myRemoteSO.connect(myNC);

参数

myConnection:NetConnection — 使用实时消息传递协议 (RTMP) 的 NetConnection 对象,如用于与 Flash Media Server 进行通信的 NetConnection 对象。
 
params:String (default = null) — 一个字符串,用于定义将传递给服务器上的远程共享对象的消息。不能用于 Flash Media Server。


引发
Error — Flash Player 无法连接到指定的远程共享对象。确认 NetConnection 实例有效并已连接,且已在服务器上成功创建远程共享对象。

另请参见

flush()方法 
public function flush(minDiskSpace:int = 0):String

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

将本地永久共享对象立即写入本地文件。如果不使用此方法,则 Flash Player 会在共享对象会话结束时(也就是说,在 SWF 文件关闭时,在由于不再有对共享对象的任何引用而将其作为垃圾回收时,或者在调用 SharedObject.clear()SharedObject.close() 时),将共享对象写入文件。

如果此方法返回 SharedObjectFlushStatus.PENDING,则 Flash Player 将显示一个对话框,要求用户增加磁盘空间量以供此域中的对象使用。若要允许将来保存共享对象时其空间能够增长,从而避免返回值 PENDING,请为 minDiskSpace 传递一个值。当 Flash Player 尝试写入文件时,它将查找传递给 minDiskSpace 的字节数,而不是查找足够的空间以共享对象的当前大小来保存共享对象。

例如,如果预期共享对象增长到最大为 500 个字节,则即使它开始时要小得多,也为 minDiskSpace 传递 500。如果 Flash 要求用户为该共享对象分配磁盘空间,它将要求 500 个字节。在用户分配了请求的空间量之后,当以后尝试对齐该对象时(只要其大小不超过 500 个字节),Flash 将无需要求更多的空间。

在用户响应此对话框后,则会再次调用此方法。将调度 code 属性值为 SharedObject.Flush.SuccessSharedObject.Flush.FailednetStatus 事件。

参数

minDiskSpace:int (default = 0) — 必须分配给此对象的最小磁盘空间(以字节为单位)。

返回
String — 下列任一值:
  • SharedObjectFlushStatus.PENDING:用户允许来自此域的对象进行本地信息存储,但所分配的空间量不足以存储该对象。Flash Player 将提示用户留出更多空间。若要留出空间以满足共享对象在保存时的增长需要,从而避免返回值 SharedObjectFlushStatus.PENDING,请为 minDiskSpace 传递一个值。
  • SharedObjectFlushStatus.FLUSHED:共享对象已成功写入本地磁盘上的文件。

引发
Error — Flash Player 不能将共享对象写入磁盘。如果用户已永久禁止对来自该域的对象进行本地信息存储,则可能出现此错误。

注意:本地内容始终可以将来自第三方域(当前浏览器地址栏中的域以外的域)的共享对象写入磁盘,即使禁止将第三方共享对象写入磁盘。

另请参见


示例

以下代码使用值为 hostName 的 ID 创建(并在后续执行过程中检索)一个 SharedObject 对象。将名为 username 的属性添加到 SharedObject 对象的数据属性中。然后调用 flush() 方法,并检查以确定返回的是字符串 pending 还是 truefalse 的布尔值。务必注意:打开的所有 SharedObject 实例都将在 Flash Player 的当前实例关闭时自动刷新。
package {
    import flash.net.SharedObject;

    public class SharedObject_flush {
        private var hostName:String = "yourDomain";
        private var username:String = "yourUsername";

        public function SharedObject_flush() {
            var mySo:SharedObject = SharedObject.getLocal(hostName);
            mySo.data.username = username;
            var flushResult:Object = mySo.flush();
            trace("flushResult: " + flushResult);
            trace(mySo.data.username); // yourUsername
        }
    }
}
getLocal()方法 
public static function getLocal(name:String, localPath:String = null, secure:Boolean = false):SharedObject

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

返回对本地永久保留的共享对象的引用,该对象只能用于当前客户端。如果尚不存在共享对象,则此方法将创建一个共享对象。如果传递给 getLocal() 的任何值均无效,或如果调用失败,Flash Player 将引发异常。

以下代码显示如何将返回的共享对象引用赋给变量:

var so:SharedObject = SharedObject.getLocal("savedData");

注意:如果用户已选择了从不允许此域进行本地存储,则即使指定了 localPath 的值,对象也不会在本地保存。本地内容不遵循此规则。本地内容始终可以将第三方域(当前浏览器地址栏中域之外的域)中的共享对象写入磁盘,即使禁止将第三方共享对象写入磁盘。

为了避免名称冲突,Flash 会考虑创建共享对象的 SWF 文件的位置。例如,如果位于 www.myCompany.com/apps/stockwatcher.swf 的 SWF 文件创建了一个名为 portfolio 的共享对象,则该共享对象不会与位于 www.yourCompany.com/photoshoot.swf 的 SWF 文件所创建的另一个名为 portfolio 的对象冲突,这是因为这两个 SWF 文件源于不同的目录。

虽然 localPath 参数是可选的,但是您应该考虑该参数的用途,特别是其它 SWF 文件需要访问共享对象时。如果共享对象中的数据特定于一个不会移动到其它位置的 SWF 文件,则使用默认值将会解决问题。如果其它 SWF 文件需要访问共享对象,或如果创建共享对象的 SWF 文件以后将发生移动,则此参数的值将影响共享对象的可访问性。例如,如果在 localPath 设置为等于 SWF 文件完整路径的默认值时创建一个共享对象,那么其它任何 SWF 文件都将无法访问该共享对象。如果您以后将原始的 SWF 文件移动到另一个位置,那么,即便是该 SWF 文件也将无法访问已经存储在共享对象中的数据。

为避免意外限制对共享对象的访问,请使用 localpath 参数。允许级别最高的方法是将 localPath 设置为 /(斜杠),这样做可使域中的所有 SWF 文件都可访问该共享对象,但会增加与域中其它共享对象发生名称冲突的可能性。限制级别较高的方法是向 localPath 追加 SWF 文件完整路径中的文件夹名。例如,对于位于 www.myCompany.com/apps/stockwatcher.swf 的 SWF 文件创建的 portfolio 共享对象,可以将 localPath 参数设置为//apps/apps/stockwatcher.swf。您必须确定哪种方法能为您的应用程序提供最佳的灵活性。

在使用此方法时,请考虑以下安全模型:

假定您将要回放的 SWF 文件内容发布为本地文件(本地安装的 SWF 文件或 EXE 文件)而且,您需要从多个本地 SWF 文件访问某个特定的共享对象。在这种情况下,请注意:对于本地文件而言,可能会使用两个不同位置来存储共享对象。所用的域取决于为创建该共享对象的本地文件授予的安全权限。本地文件可以具有三种不同级别的权限:

  1. 仅能访问本地文件系统。
  2. 仅能访问网络。
  3. 既能访问网络,也能访问本地文件系统。

可以访问本地文件系统(1 级或 3 级)的本地文件将其共享对象存储在一个位置。无法访问本地文件系统(2 级)的本地文件将其共享对象存储在另一位置。

可以在包含 SWF 内容的 HTML 页中设置 objectembed 标签的 allowNetworking 参数,防止 SWF 文件使用此方法。

有关详细信息,请参阅以下部分:

参数

name:String — 对象的名称。该名称可以包含正斜杠 (/);例如,work/addresses 是合法名称。共享对象名称中不允许使用空格,也不允许使用以下字符:
~ % & \ ; : " ' , < > ? #
 
localPath:String (default = null) — 创建了共享对象的 SWF 文件的完整路径或部分路径,这将确定共享对象的本地存储位置。如果未指定此参数,则使用完整路径。
 
secure:Boolean (default = false) — 确定对此共享对象的访问是否只限于通过 HTTPS 连接传递的 SWF 文件。如果 SWF 文件通过 HTTPS 传递,则此参数值具有以下效果:
  • 如果此参数设置为 true,则 Flash Player 将创建一个新的安全共享对象或获取一个对现有安全共享对象的引用。只可由通过 HTTPS 传递的 SWF 文件对此安全共享对象进行读取或写入,而该 HTTPS 调用 SharedObject.getLocal() 并将 secure 参数设置为 true
  • 如果此参数设置为 false,则 Flash Player 将创建一个新的共享对象或获取一个对现有共享对象的引用,可以通过非 HTTPS 连接传递的 SWF 文件对此共享对象或现有共享对象的引用进行读取或写入。

如果您的 SWF 文件是通过非 HTTPS 连接传递的,并且您尝试将此参数设置为 true,将无法创建新的共享对象(或访问以前创建的安全共享对象),并且返回 null。无论此参数为何值,创建的共享对象的数量都接近域所允许的磁盘空间的总量。

下面的图示说明了 secure 参数的用途:

安全共享对象图

返回
SharedObject — 一个对共享对象的引用,该共享对象永久贮存在本地并且只可用于当前客户端。如果 Flash Player 无法创建或找到共享对象(例如,指定了 localPath 但不存在此目录时),此方法将引发异常。

引发
Error — 不论什么原因,Flash Player 均不能创建共享对象。如果禁止第三方 Flash 内容创建或存储永久共享对象,将出现此错误。用户可以在“设置管理器”的“全局存储设置”面板上禁止第三方永久共享对象,相关设置请参阅 http://www.adobe.com/support/documentation/cn/flashplayer/help/settings_manager03.html

另请参见

getRemote()方法 
public static function getRemote(name:String, remotePath:String = null, persistence:Object = false, secure:Boolean = false):SharedObject

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

返回对 Flash Media Server 上可由多个客户端访问的共享对象的引用。如果远程共享对象尚不存在,此方法将创建一个共享对象。

若要创建远程共享对象,请调用 getRemote(),然后调用 connect() 以将远程共享对象连接到服务器,如下所示:

var nc:NetConnection = new NetConnection();
     nc.connect("rtmp://somedomain.com/applicationName");
     var myRemoteSO:SharedObject = SharedObject.getRemote("mo", nc.uri, false);
     myRemoteSO.connect(nc);
var nc = new air.NetConnection();
     nc.connect("rtmp://somedomain.com/applicationName");
     var myRemoteSO:SharedObject = SharedObject.getRemote("mo", nc.uri, false);
     myRemoteSO.connect(nc);

若要确认共享对象的本地副本和远程副本是否已同步,请侦听并处理 sync 事件。希望共享此对象的所有客户端必须为 nameremotePath 参数传递相同的值。

若要创建只能用于当前客户端的共享对象,请使用 SharedObject.getLocal()

参数

name:String — 远程共享对象的名称。该名称可以包含正斜杠 (/);例如,work/addresses 是合法名称。共享对象名称中不允许使用空格,也不允许使用以下字符:
~ % & \ ; :  " ' , > ? ? #
 
remotePath:String (default = null) — 将存储共享对象的服务器的 URI。此 URI 必须与传递给 connect() 方法的 NetConnection 对象的 URI 相同。
 
persistence:Object (default = false) — 指定共享对象的数据属性的特性是本地永久储存还是远程永久储存,或者是同时进行本地永久储存和远程永久储存。此参数还可指定共享对象的本地存储位置。可接受的值包括:
  • false,指定客户端或服务器上的共享对象不是永久性的。
  • true,指定只有服务器上的共享对象是永久性的。
  • 共享对象的完整路径或部分路径,指定客户端和服务器上的共享对象都是永久性的。客户端的共享对象存储在指定路径中,而服务器中的共享对象则存储在应用程序目录中的子目录内。

注意:如果用户已选择了从不允许此域的本地存储,则即使将本地路径指定为永久性,对象也不会在本地保存。有关详细信息,请参阅类的描述。

 
secure:Boolean (default = false) — 确定对此共享对象的访问是否只限于通过 HTTPS 连接传递的 SWF 文件。有关详细信息,请参阅 getLocal 方法条目中对 secure 参数的描述。

返回
SharedObject — 对可在多个客户端间共享的对象的引用。

引发
Error — Flash Player 无法创建或找到共享对象。如果为 remotePathpersistence 参数指定不存在的路径,则将出现这种情况。

另请参见

send()方法 
public function send(... arguments):void

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

向连接到远程共享对象的所有客户端广播一条消息(包括发送该消息的客户端)。若要处理并响应该消息,请创建一个附加到共享对象的回调函数。

参数

... arguments — 一个或多个参数:标识消息的字符串、附加到共享对象的一个或多个处理函数的名称以及任意类型可选参数。处理函数的名称只能为单级形式(即不能是父/子级形式)并相对于共享对象。这些参数已进行序列化处理并通过连接进行发送,而接收处理函数按相同的顺序接收它们。若某个参数为循环对象(例如:循环的链表),则序列化函数会正确地处理引用。

注意:函数名称切勿使用保留术语。例如,myRemoteSO.send("close") 将失败。

setDirty()方法 
public function setDirty(propertyName:String):void

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

通知服务器共享对象中的属性值已更改。此方法将属性标记为 dirty,这表明属性已更改。

可以调用 SharedObject.setProperty() 为共享对象创建属性。

SharedObject.setProperty() 方法实现了 setDirty()。大多数情况下,例如,当属性的值为 String 或 Number 等原始类型时,您可以调用 setProperty() 而不是调用 setDirty()。然而,如果属性值是一个包含其自己的属性的对象,则调用 setDirty() 以指示该对象中的值的更改时间。

参数

propertyName:String — 已更改的属性名称。

另请参见

setProperty()方法 
public function setProperty(propertyName:String, value:Object = null):void

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

更新共享对象中某个属性的值,并通知服务器该属性的值已更改。setProperty() 方法显式地将属性标签为已更改或 dirty。

有关远程共享对象的详细信息,请参阅 Flash Media Server 文档

注意:SharedObject.setProperty() 方法实现了 setDirty() 方法。大多数情况下,例如当属性的值为 String 或 Number 等原始类型时,应使用 setProperty(),而不使用 setDirty。然而,当某个属性的值是一个包含其自身属性的对象时,则使用 setDirty() 来指示该对象中的值的更改时间。通常,最好调用 setProperty() 而不要调用 setDirty(),因为 setProperty() 只在值被更改的时候更新属性值,而 setDirty() 则强制所有订阅客户端进行同步。

参数

propertyName:String — 共享对象中属性的名称。
 
value:Object (default = null) — 属性值(一个 ActionScript 对象),如果为 null 则删除属性。

另请参见

事件详细信息
asyncError 事件
事件对象类型: flash.events.AsyncErrorEvent
属性 AsyncErrorEvent.type = flash.events.AsyncErrorEvent.ASYNC_ERROR

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

在异步引发异常(即来自本机异步代码)时调度。

AsyncErrorEvent.ASYNC_ERROR 常数定义 asyncError 事件对象的 type 属性值。

此事件具有以下属性:

属性
bubbles false 此属性适用于 ActionScript 3.0 显示对象(在 SWF 文件中)。
cancelable false;没有要取消的默认行为。此属性适用于 SWF 内容中使用 ActionScript 3.0 显示体系结构的显示对象。
currentTarget 当前正在使用某个事件侦听器处理 Event 对象的对象。 此属性适用于 SWF 内容中使用 ActionScript 3.0 显示体系结构的显示对象。
target 调度事件的对象。
error 触发此事件的错误。
netStatus 事件  
事件对象类型: flash.events.NetStatusEvent
属性 NetStatusEvent.type = flash.events.NetStatusEvent.NET_STATUS

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

在 SharedObject 实例报告其状态或错误条件时调度。netStatus 事件包含 info 属性,该属性为包含事件特定信息(例如,连接尝试是否成功或共享对象是否被成功写入本地磁盘)的信息对象。

定义 netStatus 事件对象的 type 属性值。

此事件具有以下属性:

属性
bubbles false
cancelable false;没有要取消的默认行为。
currentTarget 当前正在使用某个事件侦听器处理 Event 对象的对象。
info 一个对象,具有描述对象的状态或错误情况的属性。
target 报告其状态的 NetConnection 或 NetStream 对象。

另请参见

sync 事件  
事件对象类型: flash.events.SyncEvent
属性 SyncEvent.type = flash.events.SyncEvent.SYNC

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

在服务器更新了远程共享对象后调度。

定义 sync 事件对象的 type 属性值。

此事件具有以下属性:

属性
bubbles false
cancelable false;没有要取消的默认行为。
currentTarget 当前正在使用某个事件侦听器处理 Event 对象的对象。
changeList 一个数组,具有描述其状态的属性。
target 已由服务器更新的 SharedObject 实例。

另请参见

示例 如何使用示例
SharedObjectExample.as

以下代码使用 ID "application-name" 创建(并在后续执行过程中检索)一个共享对象:单击“保存”按钮时,saveValue() 方法尝试将一个名为 savedValue 的属性保存到 SharedObject 对象的 data 的属性。如果 Flash Player 要求提供保存数据的权限,当用户授予或拒绝授予权限时,将调用 onFlushStatus() 方法。单击“清除”按钮时,clearValue() 方法将删除 savedValue 中保存的值;下次加载 SWF 文件时,所检索的值为 undefined
package {
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.events.NetStatusEvent;
    import flash.net.SharedObject;
    import flash.net.SharedObjectFlushStatus;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFieldType;
    
    public class SharedObjectExample extends Sprite {
        
        private var mySo:SharedObject;
        
        public function SharedObjectExample() {
            buildUI();
            saveBtn.addEventListener(MouseEvent.CLICK, saveValue);
            clearBtn.addEventListener(MouseEvent.CLICK, clearValue);
            
            mySo = SharedObject.getLocal("application-name");
            output.appendText("SharedObject loaded...\n");
            output.appendText("loaded value: " + mySo.data.savedValue + "\n\n");
        }

         private function saveValue(event:MouseEvent):void {
            output.appendText("saving value...\n");
            mySo.data.savedValue = input.text;
            
            var flushStatus:String = null;
            try {
                flushStatus = mySo.flush(10000);
            } catch (error:Error) {
                output.appendText("Error...Could not write SharedObject to disk\n");
            }
            if (flushStatus != null) {
                switch (flushStatus) {
                    case SharedObjectFlushStatus.PENDING:
                        output.appendText("Requesting permission to save object...\n");
                        mySo.addEventListener(NetStatusEvent.NET_STATUS, onFlushStatus);
                        break;
                    case SharedObjectFlushStatus.FLUSHED:
                        output.appendText("Value flushed to disk.\n");
                        break;
                }
            }
            output.appendText("\n");
        }
        
        private function clearValue(event:MouseEvent):void {
            output.appendText("Cleared saved value...Reload SWF and the value should be \"undefined\".\n\n");
            delete mySo.data.savedValue;
        }
        
        private function onFlushStatus(event:NetStatusEvent):void {
            output.appendText("User closed permission dialog...\n");
            switch (event.info.code) {
                case "SharedObject.Flush.Success":
                    output.appendText("User granted permission -- value saved.\n");
                    break;
                case "SharedObject.Flush.Failed":
                    output.appendText("User denied permission -- value not saved.\n");
                    break;
            }
            output.appendText("\n");

            mySo.removeEventListener(NetStatusEvent.NET_STATUS, onFlushStatus);
        }
        
        // UI elements
        private var inputLbl:TextField;
        private var input:TextField;
        private var output:TextField;
        private var saveBtn:Sprite;
        private var clearBtn:Sprite;
    
        private function buildUI():void {
            // input label
            inputLbl = new TextField();
            addChild(inputLbl);
            inputLbl.x = 10;
            inputLbl.y = 10;
            inputLbl.text = "Value to save:";
            
            // input TextField
            input = new TextField();
            addChild(input);
            input.x = 80;
            input.y = 10;
            input.width = 100;
            input.height = 20;
            input.border = true;
            input.background = true;
            input.type = TextFieldType.INPUT;
            
            // output TextField
            output = new TextField();
            addChild(output);
            output.x = 10;
            output.y = 35;
            output.width = 250;
            output.height = 250;
            output.multiline = true;
            output.wordWrap = true;
            output.border = true;
            output.background = true;
            
            // Save button
            saveBtn = new Sprite();
            addChild(saveBtn);
            saveBtn.x = 190;
            saveBtn.y = 10;
            saveBtn.useHandCursor = true;
            saveBtn.graphics.lineStyle(1);
            saveBtn.graphics.beginFill(0xcccccc);
            saveBtn.graphics.drawRoundRect(0, 0, 30, 20, 5, 5);
            var saveLbl:TextField = new TextField();
            saveBtn.addChild(saveLbl);
            saveLbl.text = "Save";
            saveLbl.selectable = false;
            
            // Clear button
            clearBtn = new Sprite();
            addChild(clearBtn);
            clearBtn.x = 230;
            clearBtn.y = 10;
            clearBtn.useHandCursor = true;
            clearBtn.graphics.lineStyle(1);
            clearBtn.graphics.beginFill(0xcccccc);
            clearBtn.graphics.drawRoundRect(0, 0, 30, 20, 5, 5);
            var clearLbl:TextField = new TextField();
            clearBtn.addChild(clearLbl);
            clearLbl.text = "Clear";
            clearLbl.selectable = false;
        }
    }
}