为什么删除( DictionaryInstance[ key ] );失败?

2024-03-03

我的应用程序使用字典

protected _categoryToValueDict:Dictionary = new Dictionary();

将某物映射到另一物。

现在,在应用程序的某个时刻,我需要从Dictionary.

我实现了这个简单的方法:

    public function setCategoryNoValue( cat:TAModelCategory ):void {

        // delete( _categoryToValueDict[ cat ] );

        var old:Dictionary = _categoryToValueDict;

        _categoryToValueDict = new Dictionary();

        for ( var key:* in old ) {

            if ( key != cat ) {
                _categoryToValueDict[ key ] = old[ key ];
            }
        }

    }

如果我只使用[描述delete http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/operators.html#delete操作员]

delete( _categoryToValueDict[ cat ] );

应用程序本身在正常模式下不会抛出错误。但一旦我连载其外部数据结构到外部源[当前共享对象 http://livedocs.adobe.com/flex/3/html/help.html?content=lsos_3.html], the 应用程序无法反序列化稍后再说。

如果我使用上面的编码手动迭代删除操作,反序列化操作按预期工作并且模型出现在应用程序中。

替代方案应该是相同的。他们不应该吗?

因此,我的问题是:这两种选择有什么区别?

PS:这个问题might与...有联系我的上一个 https://stackoverflow.com/questions/7681374/serialize-circular-object-networks-using-writeobject-readobject.

UPDATE-1

Adobe 解释道这一页 http://livedocs.adobe.com/flex/3/html/help.html?content=10_Lists_of_data_3.html:


要使 myObject 引用的对象符合垃圾回收条件,必须删除对其的所有引用。在这种情况下,您必须更改 myObject 的值并从 myMap 中删除 myObject 键,如以下代码所示:

myObject = null;
delete myMap[myObject];

假设这是一个错字。不应该这样写吗:

delete myMap[myObject];
myObject = null;

为什么将空指针传递给 myMap 作为键?


好吧,我刚刚花了两个小时左右的时间来研究这个,这比我计划花的时间要多得多。但我很好奇。

我认为您可能已经发现了 ActionScript 的 AMF 编码(或者如何Dictionary类通过 AMF 序列化)。该错误会影响任何使用 AMF 的内容,因此可以使用以下命令重现完全相同的错误:ByteArray,所以我将使用它来进行演示。

考虑以下代码:

        var d:Dictionary = new Dictionary(false);
        d["goodbye"] = "world";
        d["hello"] = "world";
        delete d["hello"]

        var ba:ByteArray = new ByteArray();
        ba.writeObject(d);

        var len:uint = ba.position; 
        ba.position = 0;
        for(var i:uint=0;i<len;i++) {
            trace(ba.readUnsignedByte().toString(16));
        }

输出将是:

11 05 00 06 0f 67 6f 6f 64 62 79 65 06 0b 77 6f 72 6c 64

现在如果我们不把"hello"作为键:

        var d:Dictionary = new Dictionary(false);
        d["goodbye"] = "world";

        var ba:ByteArray = new ByteArray();
        ba.writeObject(d);

        var len:uint = ba.position; 
        ba.position = 0;
        for(var i:uint=0;i<len;i++) {
            trace(ba.readUnsignedByte().toString(16));
        }

那么输出是:

11 03 00 06 0f 67 6f 6f 64 62 79 65 06 0b 77 6f 72 6c 64

请注意,长度完全相同,但第二个字节不同。

现在让我们看看如果我不删除的话序列化"hello":

11 05 01 06 0b 68 65 6c 6c 6f 06 0b 77 6f 72 6c 64 06 0f 67 6f 6f 64 62 79 65 06 02

请注意05第二个字节中的内容与我们删除它时相同。我认为这是指定字典中的项目数量。我说“我认为”是因为我研究了 AMF0/3 上的文档很长一段时间,试图弄清楚这里到底发生了什么,因为这似乎不应该是字典的序列化,但它相当一致,但我不明白。

所以我认为这就是为什么你遇到异常(特别是“文件结束”错误),因为它仍然认为字典中应该有另一个项目应该被反序列化。

你的替代方法之所以有效,是因为你正在构建一个新的字典并填充它......它的“内部计数器”只会不断增加,所以它就像一个魅力。

另一件需要注意的事情是,如果你设置d["Hello"] = undefined,它不会抛出异常,但该项目会抛出异常not从字典中删除。键被序列化为值undefined在 AMF 流中。因此,生成的字节流比它不存在时要长。

使用Object似乎没有表现出同样的行为。不仅不会产生错误,生成的字节码更符合我可以从 Adob​​e 找到的 AMF0/3 文档。生成的“密钥”实际上从序列化中删除,就像它实际上从未存在过一样。所以我不确定他们使用什么特殊情况Dictionary(显然未记录的 AMF3 数据类型0x11),但从其中删除项目时效果不佳。

对我来说这似乎是一个合法的错误。

edit

所以我进一步挖掘并发现其他人在谈论AMF 序列化Dictionary http://dev.pyamf.org/attachment/ticket/696/dict.patch.

0x11 : Dictionary Data Type
0x05 : Bit code: XXXX XXXY
     : If y == 0 then X is a reference to a previously encoded object in the stream
     : If y == 1 then X is the number of key/val pairs in the dictionary.

所以如果这种情况5&1 == 1 and 5>>1 == 2,因此它期望“坏”序列化版本中有两个键/值对。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么删除( DictionaryInstance[ key ] );失败? 的相关文章

  • 在 Flex SDK 上叠加 AIR SDK 后出现问题

    我尝试在 Windows 计算机上将 AIR SDK 覆盖到 Flex SDK 上 但之后遇到问题 我尝试覆盖两个 SDK 的多个官方版本 包括 Apache Flex SDK 并按照此处提到的步骤进行操作 http helpx adobe
  • 如何在flex中绘制虚线

    经过一番搜索和阅读 Graphics 类文档后 我找不到指定线条的线条样式的方法 我的意思是这条线是实线还是虚线 有人可以帮助我吗 Thanks 无论如何 您不能仅仅通过使用 Flex 库类 当然 你也可以自己做 这是一个实现它的类 根据找
  • 如何保护swf文件不被反编译?

    我正在使用 Flex 框架从事重要项目 我想对我的算法和代码保密 是否有可能以某种方式保护 swf 文件不被反编译 我不希望有人使用 flash 反编译器提取我的代码 Thanks 这很简单 只需将其保存在您的 PC 上 不要将其放在网络上
  • 使用as3在第二帧上添加影片剪辑

    如何使用 AS3 类中调用的 addChild 在特定帧上添加影片剪辑 我的问题是如何访问特定的框架 谢谢 棘手的事情是处理帧 实时循环 我会这样做的方式是 添加事件监听器FRAME CONSTRUCTED http help adobe
  • BlazeDS 与 GraniteDS [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Flex 中对 PHP 字符串使用换行符

    这是我的 MXML
  • 有什么方法可以分析 Flex 中内置的 SWF 的大小吗?

    我的 Flex 应用程序看起来比应有的要大 里面有很多代码 但资产不多 而且看起来很大 但我不知道如何弄清楚空间的去向 我知道 link report 选项 但它只给出外部链接库类的大小 我非常有兴趣查看应用程序中所有类和资源大小的报告 如
  • as3 事件 - 类型强制失败?

    我正在将事件从孩子发送到父母 swf 它工作正常 直到我使用预加载器 swf 加载父级 然后父级停止从子级获取事件 我现在收到此错误 TypeError Error 1034 Type Coercion failed cannot conv
  • 换肤时访问 hostComponent 的自定义属性 - Flex 4.5、SDK 4.5

    使用 SDK 4 1 我能够从自定义皮肤访问自定义按钮组件的自定义属性 我当前正在工作的项目需要 SDK 4 5 但我无法访问这些属性 这是一个例子 自定义按钮组件
  • 求反射角的弧度

    我正在编写一个简单的 Flash 游戏 只是为了学习 Flash 并提高我的数学能力 但我对弧度感到非常困惑 因为这对我来说是新的 到目前为止 我所做的是使用鼠标 单击并释放 使用弧度向该方向射出一个球 现在我想要发生的是 当球撞到墙壁时
  • 如何从 Flex Spark 列表的 DataProvider 对象获取其 ItemRenderer?

    在 Flex 中 我可以创建一个 ItemRenderer 来表示列表 DataProvider 中的每个项目 但如何通过 DataProviders 对象访问 ItemRenderer 的实例 就像是myList getItemRende
  • Flex 与 ActionScript

    我正在尝试构建 实现一个 Flash 视频播放器来播放视频 我研究了 Flex 并仅使用 VideoElement 构建了一个基本应用程序 它在没有静态链接库的情况下编译为 41k 在链接库时编译为 300k 我生成了报告 但仍然不确定为什
  • 使用多个模块时优化 Flex

    我有一个 Flex 应用程序 加载时间非常重要 消费者网站 我希望能够在屏幕上显示一些内容 然后允许根据需要加载其他模块 我面临的问题是所有模块的总和比我将所有组件包含在单个 swf 文件中要大得多 原因很明显 例如 访问 Web 服务所需
  • Flash 未在调试播放器中显示错误/堆栈跟踪(firefox/chrome/whatnot)

    我正在尝试调试在线默默地失败的应用程序 我 100 确定我正在运行 Flash 调试播放器 为了确保我不会丢失它 我故意抛出一个错误 但 Flash 在浏览器中没有显示任何 stracktrace 我快要失去它了 有什么线索吗 我正在 ch
  • 正确地将 flash.utils.Dictionary 序列化为 SharedObject

    我的 Flex 项目中有一个名为 HashMap 的便利集合类 它本质上是 flash utils Dictionary 的包装器 带有一堆便利方法和添加的 同步的 ArrayCollection 以便我可以将 HashMap 传递给需要的
  • 在 C# 中加密并在 Flex 中解密

    我需要解密 Flex 中的一些数据 这些数据是用 C 加密并写入文件的 为了简单起见 我选择使用 as3crypto As3 库和 Bruce Schneier C 库 AS3 as3加密链接 http code google com p
  • 在 ActionScript 3 中在形状上绘制文本

    有没有办法仅使用 ActionScript 在 DisplayObject 或 Shape 中绘制文本 我在网上找到的唯一方法是创建 TextField 但我无法将 TF 添加到 DisplayObject 或 Shape Edit 解决了
  • 在应用程序创建完成时设置 Spark DataGrid 列的默认排序(Flex 4.5)

    我有一个包含多个列的 Spark DataGrid 组件 我希望我的应用程序默认按 DataGrid 中第一列的降序排列 我想使用单击顶部标题一次时发生的内置默认排序 我不需要对我正在使用的 ArrayCollection 进行排序或更改比
  • 使用ExternalInterface和IE从JavaScript获取Flash中的当前URL

    我正在尝试获取 Flash 播放器当前所在的 URL 不是 swf 文件的 URL 而是浏览器指向的 URL 到目前为止我已经使用过 var st String ExternalInterface call window location
  • 在 ant/nant 中构建 Flex 项目

    我的公司经常遇到 Flex 项目构建中断的问题 出现该问题的主要原因是开发人员在本地计算机上执行的构建与在构建计算机上发生的构建根本不同 开发人员正在使用以下方式构建项目FlexBuilder eclipse并且构建机器正在使用命令行编译器

随机推荐

  • 为 Mips 架构编译 C

    我已经看到了几种方法来做到这一点 到目前为止我还没有尝试过几种 但我想为了方便起见隔离这个方法 应该有一种方法可以通过 VIA gcc 来做到这一点 我更喜欢这个 我只是不断碰壁 我正在使用 debian7 并且可以使用其他任何风格 我暂时
  • 有人知道托管 TeamCity 构建提供商吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我希望建立一个 TeamCity 服务器来持续构建 NET Web 应用程序 我已经有了托管 所以我不想
  • 如何使用 PHP 将 base64 编码的二进制数据保存到 zip

    我从 API 请求响应中获取 Base64 二进制编码数据 我需要将其保存为 zip 文件 我使用如下代码
  • git-svn 可以像本地 subversion 客户端一样处理 CRLF 吗?

    我有一个托管在 Linux 上的 Subversion 存储库 但只能通过 Windows 客户端访问 因为它是大型 Windows 应用程序的源代码 如果我可以使用 git svn 由 msysgit 提供 处理这个存储库 那就太棒了 我
  • 在同一位置绘制顶点

    有没有一种方法可以在同一位置绘制两个图的共享节点 例如 两张图 g1 graph ring 5 V g1 name c node1 node2 node3 node4 node5 g1 g1 V g1 1 g2 graph ring 5 V
  • 更有效地编写 HTTP 脚本

    很多时候我想自动化 http 查询 我目前使用 Java 和 commons http 客户端 但可能更喜欢基于脚本的方法 事情真的又快又简单 我可以在其中设置标头 转到页面 而不必担心设置整个 OO 生命周期 设置每个标头 调用 html
  • GWT 2.4.0 RequestFactory 多态性

    GWT 2 4是否支持这种情况 Entity class MyBase Entity class MyChild1 extends MyBase Entity class MyChild2 extends MyBase ProxyFor M
  • 如何在 Remix.run 开发模式下使用内存缓存?

    我需要从一个非常慢且很少变化的 API 获取数据 所以我想我应该使用内存缓存 我首先尝试了一种非常简单的方法 只需将其保存到路径中加载器函数范围之外的变量中 let cache export const loader async gt if
  • 将两个集合与范围条件组合起来

    我有一个集合 产品 其中包含如下文档 id 142347106 name product 1 id 135377126 name product 2 我还有另一个系列 价格 id ObjectId 59310a6bad6e99863c2a6
  • MySQL 与实体框架 6

    我一直在尝试为我的 MySQL 服务器添加 EF 模型 但没有机会 因为它要么在为我的项目选择实体框架版本之前关闭 要么给出 您的项目引用了最新版本的实体框架 但是 无法为您的数据连接找到与此版本兼容的实体数据库提供程序 错误 并且我无法为
  • 针对 Python Web 开发的 TDD 资源 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我不是一名黑客 也不是一名全职程序员 但我希望开始我自己的完整应用程序开发实验 如果我在这里错过了一些简
  • 从 io.Reader 到 Go 中的字符串

    我有一个io ReadCloser对象 来自http Response目的 将整个流转换为最有效的方法是什么string object EDIT 从 1 10 开始 strings Builder 就存在了 例子 buf new strin
  • 如何在测试 FastAPI 应用程序时触发生命周期启动和关闭?

    作为 FastAPI 的新手 我正在努力测试比我在教程中看到的稍微困难的代码 我用fastapi cache模块和Redis是这样的 from fastapi import Depends FastAPI Query Request fro
  • 如何仅在Android移动设备中而不是在数据库中获取macid和手机号码

    如何仅在Android移动设备中而不是在数据库中获取macid和手机号码 try this WifiManager manager WifiManager getSystemService Context WIFI SERVICE Wifi
  • queryselectorAll - 查找具有多个匹配类的元素

    使用 JS queryselectorall 方法可以选择具有 2 个匹配类的特定标记名称的元素 例如 我有一个元素 a class classOne classTwo a 使用 queryselectorall 我可以选择一个类名 doc
  • Java 9 中的 require 和 require 传递语句有什么区别?

    有什么区别requires and 需要传递性模块声明中的模块语句 例如 module foo requires java base requires transitive java compiler 可读性回顾 如果模块bar requi
  • GitHub 页面未更新

    我在 GitHub 页面上遇到了一个奇怪的问题 我将新提交推送到我的个人页面maltzj github io http maltzj github io 但新文章没有出现在那里 当我在本地执行服务器时 帖子位于localhost 4000
  • 用于查找字符串中 URL 的正则表达式

    有谁知道我可以使用正则表达式来查找字符串中的 URL 我在 Google 上找到了很多用于确定整个字符串是否是 URL 的正则表达式 但我需要能够在整个字符串中搜索 URL 例如 我希望能够找到www google com and http
  • 想要将唯一值转换为第一/第二/第三变量

    我有一个数据集样本 需要转换为宽格式 但我有一个特定问题 尚未在 StackOveflow 上看到解决 我想用来制作长数据集的列对于每一行都有唯一的值 但我想创建一个新的数据集 以便每个 idvar 的 n 个属性有 n 个变量 我需要转换
  • 为什么删除( DictionaryInstance[ key ] );失败?

    我的应用程序使用字典 protected categoryToValueDict Dictionary new Dictionary 将某物映射到另一物 现在 在应用程序的某个时刻 我需要从Dictionary 我实现了这个简单的方法 pu