Actionscript 3 如何使对象网络序列化为文件,而不是SharedObject?
目前,我确实将我的模型对象序列化到SharedObject实例:Actionscript 3 如何使对象网络序列化为文件,而不是SharedObject?,actionscript-3,actionscript,flash-builder,flexbuilder,Actionscript 3,Actionscript,Flash Builder,Flexbuilder,目前,我确实将我的模型对象序列化到SharedObject实例: try { var mySo:SharedObject = SharedObject.getLocal("sig"); mySo.clear(); mySo.data.model = _model; mySo.flush(); } catch ( e:Error ) { Alert.show( 'Leider konnte kein Modell geladen wer
try {
var mySo:SharedObject = SharedObject.getLocal("sig");
mySo.clear();
mySo.data.model = _model;
mySo.flush();
} catch ( e:Error ) {
Alert.show( 'Leider konnte kein Modell geladen werden.' );
}
同样,我使用SharedObject实例加载保存的模型。效果很好
最后,我想将它序列化为一个文件,但失败了。以下是如何:
var fp: File = File.applicationStorageDirectory;
fp = fp.resolvePath( PREFS_FILENAME );
var _prefsStream:FileStream;
_prefsStream = new FileStream();
_prefsStream.open( fp, FileMode.WRITE );
_prefsStream.endian = Endian.BIG_ENDIAN;
_model.writeExternal( _prefsStream );
_prefsStream.close();
补充读取操作突然中断并报告丢失的字节
事实上,我无法想象FileStream/\u model.writeExternal()是如何序列化的,因为它需要知道一个新的序列化操作即将开始。如果它不知道,它将无法确定哪些对象实例是要序列化的
因此,我认为我的概念是完全错误的,或者我错过了如何初始化序列化操作
请解释一下,我遗漏了什么。
我很乐意从共享对象中读取原始字节数组并将其写入文件。不幸的是,我没有找到从SharedObject检索某个属性的ByteArray的方法,在我的例子中是mySo.data.model
。
我的问题与这一点关系不大:我曾经不得不对我构建的外部化框架执行单元测试,我就是这样做的:
byteArray.writeObject(myObject);
byteArray.position = 0;
readValue = byteArray.readObject();
另外,我认为您不必担心字节顺序,我认为默认值是big-endian
因此,就你的情况而言,我认为你需要:
fileStream.writeObject(myObject)
与之相反:
myObject.writeExternal(_prefsStream);
运行时应自动在模型上调用
writeExternal
。关于字节顺序:希望确保代码跨平台。只是为了确定;-)啊,writeObject()可能是关键点!让我看看。会回来的…非常感谢!很好的提示!好的,writeObject()似乎准备/维护已序列化对象实例的列表以及所有其他的神奇功能。不过:writeObject()如何知道新的序列化操作刚刚开始?我的意思是,它如何知道它需要保存所有可访问的对象实例?它在对象树上爬行。例如,对writeObject
的每次调用都会执行一个测试,以查看对象是否实现了IDataOutput
或IExternalizable
。如果是这样,它将调用对象上的writeExternal
,使其有机会序列化自身。如果不是,它会尝试尽可能地序列化它(使用公共属性等),或者如果它是一个简单的对象(即字符串、数字、对象、数组等),它只会调用这些方法来序列化它。我一直在与IExternalizable
斗争,但一旦掌握了窍门,就可以做一些非常酷的事情。而且,如果一个自定义类序列化另一个自定义类,它只会重复并不断爬树,直到整个树被序列化。Type。经验法则:要序列化,请实现writeExternal()和readExternal()方法:在这些例程中,如果要向序列化目标/源写入或从序列化目标/源读取,请始终使用writeObject()和readObject()。