love8gege 2019-10-26 15:33 采纳率: 0%
浏览 500

AMF3 反序列 DSK时出现的问题!!请高手指点!

图片说明

程序在暂停之前运行正常,发送接收的数据也正常,只是想把接收的AMF3数据转换成 message时出错如下图:
图片说明

接下来附上 发送接收的数据:
图片说明图片说明

经查,服务端 把 Content对象的名称由 flex.messaging.messages.AcknowledgeMessage 转换成了别名 DSK ,导致 反序列后 Readmessage不能读出数据。

下面这段是网上查到的:
收到数据后,需要根据amf-packet-structure,对包体进行解析,解析完包头后,知道type为binary的header或message,在使用Amf0Input进行解析,在Amf0Input内部会根据数据类型切换到Amf3Input进行解析。

 

在解析的过程中,有可能出现header-length 或者message-lenght为-1,0xffffffff,的情况,如果出现了该情况,则不能简单的间输入数据拷贝已知的长度然后,交由AMF进行处理,事实上是直接将DataInputStream传给Amf0Input即可。

 

在使用的过程中,由于需要让AMF支持允许的类,需要调用

void ClassDeserializationValidator.addAllowClassPattern(String classNamePattern)
进行处理。

 

AMF可以针对未知的数据类型,产生键值对,只需要指定

SerializationContext context = SerializationContext.getSerializationContext();
context.createASObjectForMissingType = true;
该配置生效后,即可创建第三方的数据类型。

 

同时,在发送response时,AMF数据,默认将flex.messaging.messages.AcknowledgeMessageExt

当作了别名DSK进行了处理。

Specifics of AMF Support

Flash or Flex objects can implement the flash.utils.IExternalizable interface and fully control the way an object is serialized. LoadComplete supports only some of these objects, namely:

flex.messaging.io.ArrayCollection
flex.messaging.io.ObjectProxy
flex.messaging.io.ArrayList
DSK (shorthand version of flex.messaging.messages.AcknowledgeMessageExt)
As for other objects implementing the IExternalizable interface, LoadComplete does not parse them and does not support modifying data in them. In the Parameters tab it displays these objects as objects of the [Binary data] type.

所以需要使用flex的别名机制,从而让AMF能处理DSK类

void ClassAliasRegistry.registerAlias(String alias, String className)
ClassAliasRegistry.getRegistry().registerAlias("DSK", "flex.messaging.messages.AcknowledgeMessageExt");
 
————————————————
版权声明:本文为CSDN博主「chnming1987」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chnming1987/article/details/84556493
————————————————

在我的C#中该如何使用别名机制? 或者直接解析接收的AMF3数据也行,恳请高手帮解决一下为盼,谢谢!!!! 我没有 C币 ,实在对不住

暂时只能用了一个笨的办法来解决,使用 JAVA库 ,通过 IKVM转换为DLL 再用C#调用处理,导致发包文件太多,容量也大,开始稍微有点慢,重复执行后就快多了。
最终的解决方案只能是直接用C#来处理,等有时间先研究一下 AMFParse 的Fiddler 的插件再重新做吧,至少现在能用了,解决了燃眉之急!

  • 写回答

1条回答

  • 雪梅零落 全栈领域优质创作者 2024-05-07 11:38
    关注

    AMF3是一种数据格式,它可以将数据进行序列化和反序列化。在反序列化时,可能会出现一些问题,比如:
    1.数据格式错误:如果序列化的数据格式不符合AMF3标准,那么在反序列化时就会出现问题。
    2.数据类型不匹配:如果反序列化的数据类型与预期的类型不匹配,就会出现问题。
    3.数据长度不足:如果反序列化的数据长度不足,就会出现问题。
    当出现这些问题时,可能会导致程序异常或者崩溃。因此,在使用AMF3进行数据序列化和反序列化时,需要特别注意数据格式和数据类型的匹配,以及数据长度的检查。

    评论

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 虚心请教几个问题,小生先有礼了
  • ¥30 截图中的mathematics程序转换成matlab