[诚心求教]如何用C#将AFM3中的AsObject转换成C#实体类

zhaoguo2007 2010-02-11 10:33:16
最近在研究用AS3 Socket + AFM3 + C# Socket做通信
目前连接,发送消息一切都正常,就是当flex端将压缩后的二进制数据发送到服务端时不知道改如何将解压缩后的AsObject对象转化成特定的C#实体类.

代码说明如下
flex端无异常

private function onConnect( event:Event ):void {
//连上服务端后压缩单体对象发送到服务端
textField.text = "已连接上服务器,下面发送消息...";
var param: Object = {Id: '1', Name: '赵果', Address: '中国浙江'};
var _bytes:ByteArray = new ByteArray();
_bytes.writeObject(param);
_bytes.compress();
socket.writeBytes(_bytes);
socket.flush();
}

private function onData( event:ProgressEvent ):void {
//接收到服务端的消息解压缩后内容也能正常显示
var _bytes:ByteArray = new ByteArray();
while(socket.bytesAvailable > 0){
socket.readBytes(_bytes);
}
_bytes.uncompress();
var tmp:Object = _bytes.readObject();
textField.text = tmp.Id + ',' + tmp.Name + ',' + tmp.Address;
}


问题出在服务端

private void onReceive(ICourageService server, object target)
{
.......
SocketAsyncEventArgs _eventArgs = target as SocketAsyncEventArgs;
byte[] _bytes = _eventArgs.Buffer;//服务端接收到的二进制数据
//利用FluorineFx组件实现ByteArray解压缩
MemoryStream ms = new MemoryStream(_bytes, 0, _eventArgs.BytesTransferred);
FluorineFx.AMF3.ByteArray ba = new FluorineFx.AMF3.ByteArray(ms);
ba.Uncompress();
STCServer.Node node = (STCServer.Node)ba.ReadObject();//问题就出在这里,运行到此行报错说无法将AsObject对象强制转换成Node类对象
......
}

namespace STCServer
{
public class Node
{
public uint ID;
public string Name;
public string Address;
}
}


问题大概就是这样,找了好久都不知道如何才能将AFM3解析出来的AsObject()转换成C#中的实体类STCServer.Node,希望有遇到过相同问题的高手帮忙解决下啊,在线等!
...全文
737 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tomstoday 2012-06-01
  • 打赏
  • 举报
回复

public static class AmfEntityConvert
{
delegate object ConvertAction(object data);
static Dictionary<Type, ConvertAction> dicTypeRelation = new Dictionary<Type, ConvertAction>();
static AmfEntityConvert()
{
dicTypeRelation[typeof(FluorineFx.AMF3.ByteArray)] = new ConvertAction((object data) =>
{
byte[] bytes = null;
if (data != null)
{
bytes = (data as FluorineFx.AMF3.ByteArray).GetBuffer();
}
return bytes;
});
}

public static T ConvertObject<T>(object asObject)
{
if (asObject != null)
{
Type type = asObject.GetType();
if (dicTypeRelation.Keys.Contains(type))
{
return (T)dicTypeRelation[type](asObject);
}
else
{
return (T)Convert.ChangeType(asObject, typeof(T));
}
}
return default(T);
}

public static object ConvertData(Type type, object obj, params object[] pams)
{
Type classType = typeof(AmfEntityConvert);
MethodInfo staticMethod = classType.GetMethod("ConvertObject");
MethodInfo genericMethod = staticMethod.MakeGenericMethod(type);
return genericMethod.Invoke(obj, pams);
}

/// <summary>
/// 转换ASObject对象为.Net类型对象
/// </summary>
/// <param name="pObj"></param>
/// <param name="type"></param>
/// <returns></returns>
public static object ConvertEntity(ASObject asObjeect, Type type)
{
try
{
var tempObj = Activator.CreateInstance(type);
foreach (var asObj in asObjeect)
{
string key = asObj.Key;
object value = asObj.Value;

MemberInfo[] members = type.GetMember(key);
if (null != value && members != null && members.Length > 0)
{
object newValue = null;
Type asValueType = asObj.Value.GetType();

//.Net类型实体成员
MemberInfo member = members[0];
Type memberType = null;
FieldInfo field = null;
PropertyInfo property = null;
if (member.MemberType == MemberTypes.Field)
{
field = type.GetField(member.Name);
memberType = field.FieldType;
}
if (member.MemberType == MemberTypes.Property)
{
property = type.GetProperty(member.Name);
memberType = property.PropertyType;
}

if (property != null || field != null)
{
//如果是ASObject对象
if (asValueType == typeof(ASObject))
{
newValue = ConvertEntity((ASObject)value, memberType);
}
//如果是数组集合
else if (asValueType == typeof(Object[]))
{
Type subtype = Assembly.GetAssembly(memberType).GetType(memberType.FullName.Replace("[]", ""), true);

object[] arrobj = (Object[])value;
var objData = Array.CreateInstance(subtype, arrobj.Length);
for (int nn = 0; nn < arrobj.Length; nn++)
{
FluorineFx.ASObject asData = (FluorineFx.ASObject)arrobj[nn];

var val = ConvertEntity(asData, subtype);
objData.SetValue(val, nn);
}
newValue = objData;
}
//基本类型
else
{
newValue = ConvertData(memberType, null, value);
}

if (field != null)
{
field.SetValue(tempObj, Convert.ChangeType(newValue, memberType));
}
else if (property != null && property.CanWrite)
{
property.SetValue(tempObj, Convert.ChangeType(newValue, memberType), null);
}
}
}
}
return tempObj;
}
catch (Exception ex)
{
return null;
}
}
}
yangfanwx 2011-04-26
  • 打赏
  • 举报
回复
FluorineFx.ASObject result = (FluorineFx.ASObject)call.Result;
string s = result["updatetime"].ToString();
yangfanwx 2011-04-26
  • 打赏
  • 举报
回复
不是 obj[1]obj[0] 是
string s = obj["updatetime"].ToString();
是返回的 Result 里面的键值对 里的“键”
romeoqsam2 2010-09-26
  • 打赏
  • 举报
回复
问一下

我在这一步的时候就错了
FluorineFx.AMF3.ByteArray ba = new FluorineFx.AMF3.ByteArray(ms);

"FluorineFx.IO.AMFReader" 的类型初始化设定项引发异常

用的官方的例子出现的,请问怎么解决
jiangjianjun1688 2010-09-13
  • 打赏
  • 举报
回复
标记一下
zxd1010 2010-03-11
  • 打赏
  • 举报
回复
obj[1]obj[0] 好像不行
zhaoguo2007 2010-02-11
  • 打赏
  • 举报
回复
搞定了哈哈
这里把解决办法帖一下好了
MemoryStream ms = new MemoryStream(_bytes, 0, _eventArgs.BytesTransferred);
FluorineFx.AMF3.ByteArray ba = new FluorineFx.AMF3.ByteArray(ms);
ba.Uncompress();
ASObject obj = (ASObject)ba.ReadObject();//关键在此,AsObject本身原来是一个Hash表,所以直接用Key,Value的形式读取就行了,不必转换成实体类,虽然这个做法不太严谨,不过也挺省事的嘿嘿~`
string str = obj["Id"].ToString() + "," + obj["Name"].ToString() + "," + obj["Address"].ToString()

只有一个朋友顶那分全给二楼的朋友好了哈哈
zhaoguo2007 2010-02-11
  • 打赏
  • 举报
回复
引用 1 楼 xhueducls 的回复:
ba.ReadObject();跟踪一下这个返回的对象有哪些属性,这个对象跟你定义的node类没关系怎么能强转呢?
把ba.ReadObject()中对应的属性值付给node类也行。

ba.ReadObject()里跟踪了没属性,从flex端压缩后发送到服务端来后,服务端再解压缩出来的一个AsObject类型对象.我就是想问怎么将这个AsObject类型的对象转换为C#实体类,应该需要一步类型映射的过程.
xhueducls 2010-02-11
  • 打赏
  • 举报
回复
ba.ReadObject();跟踪一下这个返回的对象有哪些属性,这个对象跟你定义的node类没关系怎么能强转呢?
把ba.ReadObject()中对应的属性值付给node类也行。
smc-新款油雾分离器-微雾分离器AFM,AFDpdf,smc-新款油雾分离器-微雾分离器AFM,AFD部分介绍如下:      SMC油雾分离器,日本SMC微雾分离器SMC超微油雾分离器能做出相应的反应动作,同时又必须有一经常作用的恢复力使调速器回复初始状态。离心调速器的弹簧就是产生恢复力的零件。这样的调速器称静态稳定的调速器。但是静态稳定的调速器也可能在调节过程出现动态不稳定性,当调节动作过度而出现反向调节时,实际调节动作会形成一个振荡过程。使振荡能很快衰减的调速器,称为动态稳定的调速器,否则是动态不稳定的调速器,后者不能保证机器正常工作。SMC油雾分离器,日本SMC微雾分离器在调节系统增加阻尼是提高动态稳定性的一种方法。     日本SMC超微油雾分离器罐体内装有纳污容量大、使用寿命长、过滤精度高的滤芯,污水进入过滤器后,较粗的颗粒会因惯性沉淀下来,较细的颗粒被滤芯表面拦截,最后净水经过出水管线流出过滤器。随着过滤时间增加,沉积在滤芯上的污染物越来越多,过滤器进出口压差逐渐上升,当上升到最在允许工作压差时(0.15MPa),说明滤芯已被堵塞,需要及时更换。另外, 由于预过滤器滤芯是用超细玻璃纤维滤纸制成,因其固有特性,使得预过滤芯同时又分担一部分破乳的功能, 即将水包油进行破乳切开, 然后输送至重力分离器内聚结上浮。预过滤器作为高效聚结分离器的保护性装置,具有高的过滤精度,能够过滤去除细小的悬浮物杂质(>10μm), 防止以颗粒为核心而不能破乳除油,因此有效延长后续设备聚结滤芯和吸附滤芯的使用寿命,减少运行维护成本。     日本SMC超微油雾分离器内装的聚结滤芯是我公司自行研制设计的,它利用特殊超细纤维材料并结合内部巧妙的结构设计,将水细微的乳化油破乳并逐步聚结成大的油滴,然后上浮至集油腔,由排油口自动排出,处理后排出的水含油量≤5mg/L。在系统运行过程,进口含油量和进口流量对聚结效果影响较小,出水口含油浓度稳定。    调节系统的阻尼,例如运动副的摩擦,使调速器具有一定的不灵敏性,即当被控制轴的转速稍微偏离设定值时,调速器不产生相应的动作。机械式调速器的不灵敏性一般约为其设定值的1%。灵敏性过高的调速器,也会由于机组正常运转周期性的速度波动而产生不应有的调节动作。 AFM20-01-A AFM20-01BC-CR AFM20-01C AFM20-01-C AFM20-01C-2 AFM20-01C-2R AFM20-01C-2R-A AFM20-01C-6C AFM20-01-C-A AFM20-01C-A AFM20-01C-C AFM20-01-R AFM20-01-X77 AFM20-02 AFM20-02-2 AFM20-02-2-A AFM20-02-2R AFM20-02-6 AFM20-02A AFM20-02-A AFM20-02B-2R AFM20-02BC-C AFM20-02BC-R AFM20-02BC-R-A AFM20-02BCX401 AFM20-02B-CX401 AFM20-02BC-X401 AFM20-02C AFM20-02-C AFM20-02C-2 AFM20-02C-2-A AFM20-02C-2R AFM20-02C-6 AFM20-02C-6C AFM20-02-C-A AFM20-02C-A AFM20-02C-C AFM20-02C-C-A AFM20-02-CR AFM20-02C-R AFM20-02-R AFM20-02-R-A AFM20-F01 AFM20-F01-A AFM20-F01C AFM20-F02 AFM20-F02-2 AFM20-F02-2-A AFM20-F02-6R AFM20-F02-A-X64 AFM20-F02C AFM20-F02C-2 AFM20-F02C-C AFM20-F02-X64 AFM20-F02-X77 AFM20-N01-2Z AFM20-N01C AFM20-N01-C AFM20-N02BC AFM20-N02-C AFM20-N02-CZ AFM20-N02C-Z AFM20-N02-Z AFM20P-060AS AFM3000-02 AFM3000-02-2 AFM3000-02-6 AFM3000-02C AFM3000-02D AFM3000-02D-2 如果需要了解更多,请点击http://smcchina.gongboshi.com

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧