首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >序列化Scene3D Papervision3D

序列化Scene3D Papervision3D
EN

Stack Overflow用户
提问于 2015-09-11 23:16:28
回答 1查看 35关注 0票数 0

我正在尝试序列化整个场景,以便可以将其保存到文件中,并在以后加载它。我知道Pv3D现在不是最好的3D引擎,但是我不想再开始整个项目。当尝试加载实际文件,并将其数据分配给场景时,会出现问题,该场景会出现#1009错误(空对象)。

代码如下:

代码语言:javascript
复制
/* Papervision3D engine setup code here */
//...
var scene:Scene3D = new Scene3D();
//...

var file:FileReference;
function LoadProyect(e:MouseEvent):void
{
    var fd:String = "3Dp Files (*.3dp)";
    var fe:String = "*.3dp";
    var ff:FileFilter = new FileFilter(fd,fe);
    file = new FileReference();
    file.browse(new Array(ff));
    file.addEventListener(Event.SELECT, onFileSelect);
    file.addEventListener(Event.COMPLETE, fileComplete);
}
function onFileSelect(e:Event):void
{
    file.load();
}
function fileComplete(e:Event):void
{
    var aScene:ByteArray = e.target.data;
    var objScene:Object = aScene.readObject();
    scene = objScene as Scene3D;
}

那么,Scene3D是可序列化的吗?(我猜是这样的,它们实际上是在以纯文本文件形式序列化时输出数据),这种方式可行吗?或者我应该自己保存每个对象并逐个加载,然后将其添加到场景中?

EN

回答 1

Stack Overflow用户

发布于 2015-09-12 04:27:54

Chapter 2 of "What can you do with bytes?"应该为您在ByteArray中读写对象提供了一个起点。

说到这里,核心功能在于writeObject()readObject(),它们都作为相关的API元素链接到registerClassAlias()

它的文档不言而喻:

当对象以动作消息格式编码时,

会保留对象的类(类型)。当您将对象编码到AMF中时,此函数将保存其类的别名,以便您可以在解码该对象时恢复该类。如果编码上下文没有为对象的类注册别名,则该对象将被编码为匿名对象。类似地,如果解码上下文没有注册相同的别名,则为解码的数据创建匿名对象。

你需要注册这个类以便反序列化它的对象。

这样做的问题是,默认情况下,只有类的public成员才会以这种方式反/序列化。为了定义自定义的反/序列化,您必须实现IExternalizable接口:

IExternalizable接口提供了对编码到数据流中的类的序列化的控制。IExternalizable接口的writeExternal()和readExternal()方法由一个类实现,以允许对数据流的内容和格式进行自定义

当然,这将是大量的工作,因为Papervision3D不实现该接口。您可以扩展相关的类并实现接口,但您可能会遗漏一些东西。您必须了解这些类的所有内部工作原理。首先看看registerClassAlias()是否足够。

Also check out this related question.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32526786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档