反序列化时如何识别是哪个对象? 一个C#的C/S程序,采用异步方法,通过SoapFormatter将对象序列化发送,接收时反序列化对象.问题时发送多个对象,接收时,如何在反序列化时得知要反序列化的是哪个对象? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 知道反序列化是为了提取出对象,我的问题是如果需要发送多个对象怎么办,如何在有效地反序列化?比如obj是一个MyObject对象:序列化:NetworkStream netstrm = client.GetStream();IFormatter formatter = new SoapFormatter();formatter.Serialize(memstrm, obj);反序列化:IFormatter formatter = new SoapFormatter();MyObject clientObject = (MyObject)formatter.Deserialize(netstrm);如果还有MyObject2,MyObject3类型呢,我暂时的一个解决办法是建立一个复合对象,只发送一个CompositeObject对象,通过解析CompositeObject对象中clientType字段的来反序列化.如下所示.public enum OjbectType { OBJ_1, //表示要传输的是MyObject1对象 OBJ_2, //表示要传输的是MyObject2对象 OBJ_3 //表示要传输的是MyObject3对象}[Serializable]public class CompositeObject{private OjbectType _clientType;private Object _clientObject; //可能是MyObject1,MyObject2或MyObject3}但这样在类型过多时太复杂,问还有没有更好的办法 ? ? ? 如果不知道类型就按Object来反序列化,然后使用GetType()得到类型信息再做出操作决定 定义一个基类A,基类有个属性m;要序列化反序列化的几个类都继承这个基类,每个子类的m属性值是不同的;序列化的是子类A1,A2...反序列化时用基类A,即A a = (A)formatter.Deserialize(netstrm);然后if(a.m==1){ A1 a1=(A1) a; ... }else if(a.m==2){ A2 a2=(A2) a; ... }我就是这样做的 liuys00() : 你说的方法也可行,比我的稍好一些,也可以将m属性定义为enum类型.但这样也是存在类型过多不好管理的问题.fengfeiyang(风飞扬) : 你说的又是一种思路,但如果类型间的方法不一致且差别很大或者类型仅用作数据存储而没有方法,又该如何定义接口呢?hbxtlhx(平民百姓-自已动手,丰衣足食): 你说的方法应该可行,且能满足我的要求.由于我对Type不是很熟悉,能否有个写几段代码演示下,如序列化时是MyObject1,MyObject2,MyObject3时,发送时直接按照Object序列化了,反序列化时该怎样? 好,搞定,采用了最后一种方法,obj.GetType()结贴! 你所说的不一致是“抽象”要解决的问题,也是面向对象中最重要的部分,主要是靠对于业务的理解了。至于说只用来存储数据的对象。个人觉得这种对象不应该是Public的,应该是Peivate的,被一个Public的对象所包含的。这样对外的存取也应该有相应的方法! C#中 =! 是什么意思? 怎样删除dbo.aaa中的dbo. 我的是winform程序,本地的程序,连接数据库字符串写在本地程序中,可以访问网络上的sql数据库吗?有人说sql网络访问只限于局域网,是吗 C#winform窗体已经显示,但看不见的问题 oracle10连接报错 烦请哪位将代码改成为存为剪贴板中的图象, 源码是可以存为图象文件的啊! 如何抓取到这个网页的源代码? 水晶报表当中值的问题,请大家帮忙!!! 使用api时,如何理解布局LayoutKind 正则表达式匹配第一项 [GDI+]要学习GDI+的兄弟们进( C# ) 在 winform中 怎样播放 视频文件?
我的问题是如果需要发送多个对象怎么办,如何在有效地反序列化?比如obj是一个MyObject对象:
序列化:
NetworkStream netstrm = client.GetStream();
IFormatter formatter = new SoapFormatter();
formatter.Serialize(memstrm, obj);
反序列化:
IFormatter formatter = new SoapFormatter();
MyObject clientObject = (MyObject)formatter.Deserialize(netstrm);如果还有MyObject2,MyObject3类型呢,
我暂时的一个解决办法是建立一个复合对象,只发送一个CompositeObject对象,通过解析
CompositeObject对象中clientType字段的来反序列化.如下所示.public enum OjbectType
{
OBJ_1, //表示要传输的是MyObject1对象
OBJ_2, //表示要传输的是MyObject2对象
OBJ_3 //表示要传输的是MyObject3对象
}[Serializable]
public class CompositeObject
{
private OjbectType _clientType;
private Object _clientObject; //可能是MyObject1,MyObject2或MyObject3
}
但这样在类型过多时太复杂,问还有没有更好的办法 ? ? ?
要序列化反序列化的几个类都继承这个基类,每个子类的m属性值是不同的;
序列化的是子类A1,A2...
反序列化时用基类A,即A a = (A)formatter.Deserialize(netstrm);
然后if(a.m==1){ A1 a1=(A1) a; ... }
else if(a.m==2){ A2 a2=(A2) a; ... }我就是这样做的
你说的方法也可行,比我的稍好一些,也可以将m属性定义为enum类型.但这样也是存在类型过多不好管理的问题.fengfeiyang(风飞扬) :
你说的又是一种思路,但如果类型间的方法不一致且差别很大或者类型仅用作数据存储而没有方法,又该如何定义接口呢?hbxtlhx(平民百姓-自已动手,丰衣足食):
你说的方法应该可行,且能满足我的要求.由于我对Type不是很熟悉,能否有个写几段代码演示下,如序列化时是MyObject1,MyObject2,MyObject3时,发送时直接按照Object序列化了,反序列化时该怎样?
结贴!