【问题标题】:Serializing Scene3D Papervision3D序列化 Scene3D Papervision3D
【发布时间】:2015-09-11 15:16:28
【问题描述】:

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

代码如下:

/* 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 可以序列化吗? (我猜它们是,它们实际上是在纯文本文件中序列化时输出数据),这种方式可能吗?还是我应该将每个对象单独保存并一个一个加载,然后将其添加到场景中?

【问题讨论】:

  • 你是怎么序列化的?
  • 使用 ByteArray 类的 writeObject 方法...然后我将其保存到纯文本文件中

标签: actionscript-3 serialization flash-cs5 papervision3d


【解决方案1】:

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

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

它的文档不言自明:

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

您需要注册该类才能反序列化它的对象。

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

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

当然,这需要做很多工作,因为 Papervision3D 没有实现该接口。您可以扩展相关类并实现接口,但您可能会错过一些东西。你必须知道类的所有内部工作。先看看registerClassAlias()够不够用。

Also check out this related question.

【讨论】:

  • 尝试了 registerClassAlias 但它似乎不起作用。我是否以错误的方式使用它?它应该是:registerClassAlias("org.papervision3d.scenes.Scene3D",Scene3D)。顺便谢谢...
  • @FrancoMontanari 请提供有关正在发生的事情的更多信息。你在哪里使用那条线。 “它似乎不起作用”的说法是毫无用处的。你到底在做什么。你在期待什么?你得到什么结果?编辑您的问题并在此处添加信息。评论更多来自简短的通知和问题,而不是发布代码。
猜你喜欢
  • 2011-09-01
  • 1970-01-01
  • 2010-12-02
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 2010-10-26
  • 2011-01-02
相关资源
最近更新 更多