none
关于WebService DataSet序列化的问题 RRS feed

  • 问题

  • 请问一下WebService DataSet序列化怎么做才能达到快速传输数据?

    我现在的问题是这样的:
    1.我是采用的是WEBSERVICE+WINFORM
    2.WEBSERVICE返回一个DATASET,再通过INTERNET传输到我的WINFORM中,但是,速度好慢好慢,据说序列化/反序列化可以解决速度慢的问题,而且速度还很理想,请问题一下如何序列化与反序列化

    最好是有代码说明.

    2009年9月2日 2:46

答案

  • Hi,
       给个参考建议。

    1.你的效率主要问题是在序列化和反序列化,DataSet因为定义很多属性和约束等关系,导致在序列化和反序列化中效率低下,而且暂用宝贵的内存资源。
    建议不要使用DataSet返回数据,自定义实体类,使用数组,返回你需要的数据。
    2.尽量不要一次返回大量数据,能分页的话尽量分页,在存储过程里实现,每次只查出需要的数据。这样可以减少不必要的内存和网络资源消耗。
    3.你如果是个人学习,可以了解一下MTOM。
      如果真要使用Web Service,你可以看看WSE3.0的文章,它针对大量数据使用MTOM机制优化传输。
     
      代码的话,我之前写过一个DEmo,可以执行,但是你机器需要安全WSE3.0组件开发包。这文章里有下载链接。
    WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载

      你参考一下吧。希望对你有帮助~
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    • 已标记为答案 廖中洪 2009年9月5日 6:04
    2009年9月2日 10:50
    版主
  • Dataset序列化记得有版本问题,不同版本的Dataset序列化的结果可以不同
    解决的办法是用实体类自己控制。
    WCF比WSE更加高效,新的程序应该用WCF而不是WSE。


    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 廖中洪 2009年9月5日 6:04
    2009年9月2日 23:00
    版主
  • http://ghd258.cnblogs.com/archive/2005/12/06/291653.html
    知识改变命运,奋斗成就人生!
    2009年9月2日 3:18
    版主
  • lz您好,如果是刚开始,可以考虑先采纳上面版主们的两个意见:
    1、实现分页,不要一下把所有的数据都传给客户端
    2、用自定义类来代替DataSet.
    • 已标记为答案 廖中洪 2009年9月5日 6:04
    2009年9月5日 5:51

全部回复

  • 你好 参照下这篇文章 http://www.cnblogs.com/wlkjhxd/archive/2009/03/24/1420905.html
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年9月2日 2:51
    版主
  • 你好 参照下这篇文章 http://www.cnblogs.com/wlkjhxd/archive/2009/03/24/1420905.html
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond

    谢谢这位仁兄,不过这好像不是我想要的,你给我的好像是文件的序列化.

    我实现的是WEBSERVICE中的DATASET如何序列化到我的客户端(WINFORM),再反序列化为想要的DATASET.

    -----WEBSERVICE---------
            [WebMethod]
            public DataSet SearchCustomer()
            {
                DataSet myds = new DataSet();
                try
                {
                    OpenConn();
                    string Sql = "select * from Customers";
                    SqlDataAdapter myda = new SqlDataAdapter(Sql, Conn);
                    myda.Fill(myds, "Customers");
                    CloseConn();
                    return myds;
                }
                catch
                {
                    return myds;
                }
            }

    --------WINFORM-------------
    DataSet myds= WebService.SearchCustomer();//直接将服务器WEBSERVICE中的DATASET返回到WINFORM中,速度太慢了.我想通过序列化与反序列化来提高传输速度
    2009年9月2日 3:00
  • 使用 DataSet.RemotingFormat = SerializationFormat.Binary 可以提高效率;
    知识改变命运,奋斗成就人生!
    2009年9月2日 3:14
    版主
  • 使用 DataSet.RemotingFormat = SerializationFormat.Binary 可以提高效率;
    知识改变命运,奋斗成就人生!

    谢谢!
    请问一下,怎么实现,有没有例子?
    2009年9月2日 3:17
  • http://ghd258.cnblogs.com/archive/2005/12/06/291653.html
    知识改变命运,奋斗成就人生!
    2009年9月2日 3:18
    版主
  • 使用这种方式,数据量越大提升越明显。
    知识改变命运,奋斗成就人生!
    2009年9月2日 3:22
    版主
  • Hi,
       给个参考建议。

    1.你的效率主要问题是在序列化和反序列化,DataSet因为定义很多属性和约束等关系,导致在序列化和反序列化中效率低下,而且暂用宝贵的内存资源。
    建议不要使用DataSet返回数据,自定义实体类,使用数组,返回你需要的数据。
    2.尽量不要一次返回大量数据,能分页的话尽量分页,在存储过程里实现,每次只查出需要的数据。这样可以减少不必要的内存和网络资源消耗。
    3.你如果是个人学习,可以了解一下MTOM。
      如果真要使用Web Service,你可以看看WSE3.0的文章,它针对大量数据使用MTOM机制优化传输。
     
      代码的话,我之前写过一个DEmo,可以执行,但是你机器需要安全WSE3.0组件开发包。这文章里有下载链接。
    WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载

      你参考一下吧。希望对你有帮助~
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    • 已标记为答案 廖中洪 2009年9月5日 6:04
    2009年9月2日 10:50
    版主
  • Dataset序列化记得有版本问题,不同版本的Dataset序列化的结果可以不同
    解决的办法是用实体类自己控制。
    WCF比WSE更加高效,新的程序应该用WCF而不是WSE。


    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 廖中洪 2009年9月5日 6:04
    2009年9月2日 23:00
    版主
  • 哎......我在WebService得到的是DATASET,但要从WEBSERVICE返回到客户端,我的开始做法就是直接返回DATASET,这样3000多条记录需要15秒左右.

    据说序列化后返回到客户端,再在客户端反序列化,速度会提高很多,我试了一下,速度差不多,有时甚至变慢了


    Sheng Jiang 蒋晟 : 我对C#可能还算初阶,还不懂什么WCF,WSE,我的应用程序是采用的WINFORM+WEBSERVICE

    2009年9月5日 1:41
  • lz您好,如果是刚开始,可以考虑先采纳上面版主们的两个意见:
    1、实现分页,不要一下把所有的数据都传给客户端
    2、用自定义类来代替DataSet.
    • 已标记为答案 廖中洪 2009年9月5日 6:04
    2009年9月5日 5:51
  • lz您好,如果是刚开始,可以考虑先采纳上面版主们的两个意见:
    1、实现分页,不要一下把所有的数据都传给客户端
    2、用自定义类来代替DataSet.

    OK,谢谢!!!
    看来没有别的办法了,只有这样做了
    2009年9月5日 6:03
  • 建议在Web Service端直接字符串对象, 字符串包含xml数据,然后在客户端里对此字符串进行反序列化得到DataSet, 这样速度可以快很多. 试试吧!
    Gao Peter
    2009年11月3日 8:46
  • DataTable有个属性可以制定序列化类型,可以使用Binary,这样比默认的xml要节省带宽,
    DataSet有没有,我还没看过,上msdn一查属性就知道了。
    2009年11月3日 13:54
  • 你可以试着返回xmldocument , 这样就少了许多无用的信息.Dataset 返回的是Diffgram形式的数据,见文章 http://blog.csdn.net/bndy5337/archive/2010/03/07/5353117.aspx
    2010年3月20日 1:47