序列化问题!!!

lovvver 2005-12-27 09:49:59
这个问题,我在网上搜了一下,没找到答案!
WebService中的类标了[Serializable()]了,也就是可序列化的,但是在Web Reference里对应生成的代理类却不可序列化,请问怎么回事?
如果我在Web Reference里的类前加上[Serializable()]的话,那么我在debug模式下从客户端跟到服务端,发现需要做类型转换,即需要实现IConvertible接口(因为WebService和Web Reference里是两个类了,只是名称一样),请问我该怎么办呢?
...全文
390 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovvver 2006-01-04
  • 打赏
  • 举报
回复
多谢这么多兄弟的帮忙!!!
aspritionisdead 2006-01-02
  • 打赏
  • 举报
回复
它们不是一样的类!不同的名称空间的不同的类,而且是不同地址空间的类。
它们之间的关系是通过web services维系的,如果通过web services通信,客户端的代理和web services之间会通过soap协议在它们之间做绑定,但是你的方式,在其中加了你自己的处理(序列化),它们如何关联呢?
试想,你在命名空间n1定义了类c1,在命名空间n2定义了类c2,把c1的一个对象序列化后,可以把它反序列化为c2吗?
如果是一样的类,根本不需要进行转换。当然,如果是本地的类,虽然是不同的类,你可以通过通过某种方式转换它们,但由于你的这两个类不仅不是不同的类,而且根本就不是本地引用的类,根本不能转换。
lovvver 2005-12-31
  • 打赏
  • 举报
回复
客户端的类是Web Service的代理类,将代理类序列化,传输,反序列化,不能得到Web Service的类吗?
因为他们是一样的类,能否做转换呢?(实现IConvertible接口)
charles_y 2005-12-30
  • 打赏
  • 举报
回复
1 我说的role,是指的SysroleDAO
2 服务器和客户端交户的,应该是数据,比如我上面写的
[WebMethod]
Insert(obj data)
{
SysroleDAO role = new SysroleDAO();
role.Insert(data);
}

如果要加密压缩之类的,你要做的是对data进行处理.

3 这种想法确实比较特别,通常我们说的WebServcie不是这么用的,说句实话,意义不大.
还有,如果真的要这么做,我给你个一个解决方法,那就是传递类名和参数,服务器中根据类名用反射得到类.

webservice 本来是个简单的东西,被你搞复杂了。
lovvver 2005-12-30
  • 打赏
  • 举报
回复
楼上兄弟:
谢谢你!
1)你说这个role就放在服务器上面,这个我不能理解,因为在客户端增加一个role,肯定要传回服务器来写入数据库。这也是之所以采用WebService的原因。
2)我之所以这么做,在WebService传输过程中,我是想在做完二进制序列化后,可以加密、压缩,以达到加密、压缩传输的目的,提高WebService传输的效率和安全。
3)我的WebService是采用分发方式,只建一个WebService,然后通过这一个WebService,通过反射来执行服务器端的所有方法/操作。

我也是刚弄这个不太久,也不太熟。
或许我在WebService的理解上面有很多偏差,呵呵
aspritionisdead 2005-12-30
  • 打赏
  • 举报
回复
哦,原来你有两个要求:
1、把web reference里面的类序列化。
2、把序列化的结果(应该是个xml的字符串吧?)传递到服务端;服务器端收到后反序列化。

关于第一个要求,把要序列化的类加上序列化标志就可以。

关于第二个要求,做不到。你序列化的是客户端定义的类,服务端如何反序列化呢?
hyj_828 2005-12-30
  • 打赏
  • 举报
回复
角色数据的传递是通过对这个类的实例的传递实现的。
同时这个类在服务器端有Insert(),Update(),Delete()等方法
这个设计不太好,既然这个类的实例是保存数据用的,那么就不要他又操作数据方法.
建议你参考ms的dowamish.或者petshop.
lovvver 2005-12-30
  • 打赏
  • 举报
回复
或许有一个问题我没说清楚,
这个SysroleDAO类是对应数据库表SYS_ROLE建立的,一个类的实例就相当于一条角色数据。
角色数据的传递是通过对这个类的实例的传递实现的。
同时这个类在服务器端有Insert(),Update(),Delete()等方法。

你提的3,我的确是这么用的,将项目名,程序集名,类名传回去,通过反射得到类,实现对role的操作的。
lovvver 2005-12-29
  • 打赏
  • 举报
回复
在Web Reference里的类前我加了[Serializable()]后,它就出现了一个类型转换的问题。

比如我在客户端需要增加一个新的role,
那么先声明的一个Web Reference的SysroleDAO的实例
SysroleDAO role = new SysroleDAO(),初始化该role
->序列化
->加密
->通过WebService传输
->解密
->反序列化
->通过反射,还原为服务端的SysroleDAO类的实例,
然后执行role.Insert();

当进行到[反射]这一步骤的时候,就提示该类需要实现IConvertible接口。

此外:
EntityDAO类与SysroleDAO类一样,在服务器端都是可序列化的(SysroleDAO:EntityDAO),在Web Reference里它们的代理类都未标记为可序列化(SysroleDAO:EntityDAO),当我在Web Reference里的EntityDAO前加[Serializable()],而SysroleDAO前不加,仍然提示SysroleDAO不可序列化,如果都加,则提示要实现IConvertible接口。
charles_y 2005-12-29
  • 打赏
  • 举报
回复
兄弟,我不知道用了IDisposible接口后能不能这样做。

我奇怪的只是你这样做的目的,要执行一个role.Insert()怎么需要这么大的力气,本来这个role就放在服务器上面,你却要从客户端传回来一个,真是。。。。


要执行 SysroleDAO.insert ,只要把SysroleDAO.insert写成web服务就行了,或者你看着不舒服,顶多包装一下,如
[WebMethod]
Insert(obj data)
{
SysroleDAO role = new SysroleDAO();
role.Insert(data);
}

这样就行了。

有什么理由让你选择你所说的方法吗?
{
lovvver 2005-12-29
  • 打赏
  • 举报
回复
哪位兄弟看过的,或者知道的,帮我一把,在下不胜感激!
分不多,还有800,在下可以都奉献出来啊,呵呵
cenlmmx 2005-12-28
  • 打赏
  • 举报
回复
我也遇到过相同的问题,用的是binary序列化.
我是先把全部成员注释掉,再一个一个的加上,看序列化出不出问题,不出那就再加,出了就可能加的成员序列化有问题.总的来说先简单后复杂.
你看这个思路行不行,比你在这儿等好得多.
aspritionisdead 2005-12-28
  • 打赏
  • 举报
回复
另外你的SysroleDAO类是EntityDAO的子类,那父类EntityDAO是否是可序列化的?
aspritionisdead 2005-12-28
  • 打赏
  • 举报
回复
我不确定我是否理解你说的问题的意思.......
你是说想序列化web reference里的类?那你应该把web reference里面的类加上可序列化的标记,比如; [Serializable]。
其实这个和你的web services没有关系了,因为你要序列化的是本地的类,你应该在这个类上加可序列化标记。
GZCompiler 2005-12-28
  • 打赏
  • 举报
回复
我现在遇到一个问题是,WebService在序列化参数时,要求参数类型(可以是一个自定义类)必须有缺省的构造函数(因为参数传递时需要copy参数对象),那么这样,我能将System.Drawing.Bitmap对象作为Webservice的参数吗?Bitmap类没有缺省的构造函数。
醉龍 2005-12-28
  • 打赏
  • 举报
回复
非常关注!
lovvver 2005-12-27
  • 打赏
  • 举报
回复
因为我在客户端要把这个类的实例做为一方法的参数传到服务器上。
Eddie005 2005-12-27
  • 打赏
  • 举报
回复
在Web Reference中生成的类为什么要序列化?
charles_y 2005-12-27
  • 打赏
  • 举报
回复
类的属性标为

[SerializableAttribute],不要[Serializable()]
jc15271149 2005-12-27
  • 打赏
  • 举报
回复
不知道,序列化问题我也很头疼,顶
加载更多回复(11)

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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