Apache flex 在Flex中反序列化二进制对象时,对象初始化是如何发生的?
我想知道并着重于理解的jist是关于二进制反序列化如何在Flex3中发生的细节。什么时候调用构造函数,什么时候设置属性,私有成员是序列化的,还是所有的反序列化都在setter上发生,等等?我很难找到这方面的信息 在Flex 3 AIR应用程序中,我有一个非常复杂的对象图(只是一堆相互引用的对象,有点像大数据模型,只是有点复杂),我使用对FileStream.writeObject和根对象上的readObject的单个调用将其序列化为一个文件,这将序列化和反序列化整个对象图 我发现我需要始终有一个默认构造函数,否则当反序列化对象时,如果它们是ArrayCollection的一部分,就会出现异常。因此,我必须删除构造函数参数或设置默认值。我现在在我的类中有很多这样的setter,比如下面的mConnection通过不同的setter积累了它需要的一些信息,就像以前一样,我把这些都打包到构造函数中,因为所有的信息对于连接的运行来说都是必需的:Apache flex 在Flex中反序列化二进制对象时,对象初始化是如何发生的?,apache-flex,actionscript-3,Apache Flex,Actionscript 3,我想知道并着重于理解的jist是关于二进制反序列化如何在Flex3中发生的细节。什么时候调用构造函数,什么时候设置属性,私有成员是序列化的,还是所有的反序列化都在setter上发生,等等?我很难找到这方面的信息 在Flex 3 AIR应用程序中,我有一个非常复杂的对象图(只是一堆相互引用的对象,有点像大数据模型,只是有点复杂),我使用对FileStream.writeObject和根对象上的readObject的单个调用将其序列化为一个文件,这将序列化和反序列化整个对象图 我发现我需要始终有一个
class Client
{
private var mConnection:Connection;
public function get connection():Connection{ return mConnection; }
public var mUser:User;
public function get user():User { return mUser; }
public function set user(value:User):void
{
mUser = value;
mConnection.username = user.username;
mConnection.password = user.password;
}
private var mServer:Server;
public function get server():Server { return mServer;}
public function set server(value:Server):void
{
mServer = value;
mConnection.serverIP = value.serverIP;
}
public function Client()
{
mConnection = new Connection();
}
}
public class Server
{
[Bindable]
public var Clients:ClientsCollection = new ClientsCollection( );//contains Client type
private var mServerIP:String;
public function get serverIP():String { return mServerIP; }
public function set serverIP(value:String):void
{
mServerIP = value;
serverName = mServerIP;
}
public var serverName:String;
public function Server(serverIP:String = "")
{
this.serverIP = serverIP;
}
}
在我添加序列化之前,这在很大程度上似乎工作得很好。我在应用程序关闭时序列化对象图,在应用程序打开时反序列化对象图。发生了什么事
当我添加序列化时,我遇到了一个问题,在反序列化之后,mConnection有时会有一个空字符串,有时会有被序列化的ip地址。我能说的最好的情况是,有时对象以不同的顺序反序列化,然后对象以不同的顺序分配给属性。因此,假设在序列化对象图时,我有一个客户端的存在,它引用了一个服务器实例和一个连接,反序列化过程中的一系列事件(仅调用readObject一次)可能是:
对于任何可能因为我正在序列化一个名为Connection的类而偏离主题的人,请注意。我添加了一些代码来解决一些问题,比如在Connection类中有一个套接字实例。当然,在我关闭并重新打开应用程序并反序列化它之后,我的套接字将不会被连接,因此在序列化我的对象图之前,我将遍历并关闭套接字,并将连接类中的引用设置为null,这样就不再有对套接字的引用,因此它将不会被序列化。在下一次应用程序运行反序列化之后,我创建了一个新套接字。有点旁注:您可以将静态函数用作伪重载构造函数
class Fred
{
public function Fred()
{
// boring, default constructor with no parameters
}
public static function Freddy(aValue1 : String, aValue2 : Object = null) : Fred
{
var result : Fred = new Fred();
result.value1 = aValue1;
result.value2 = aValue2;
return result;
}
}
(是的,我确实想念我的对象Pascal虚拟构造函数,为什么要问?)