DSP v1.0--序列化和反序列化对象和DNS v1.0--得到域的邮件服务器[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 wanghao0727 的 blog

                            dsp序列化反序列化对象sdk开发包
       
     dsp(dynamic serialize packet)是一个动态序列化和反序列化对象的sdk开发包,使用dsp可以将对象序列化成数据流保存到文件中,或者将序列化后的数据流通过socket传递给远端;也可以使用dsp从文件或socket中读取数据,然后反序列化成对象。
     dsp和vc++的序列化、java的序列化有着本质的区别,比vc++和java的序列化对象具有更好的控制性,dsp提供了对象标准的序列化方式,可以将对象的数据以数据流的方式传递,不管发送方是java还是c++,也不论接收方是c++还是java,或是其它的语言,数据流都可以被正确地还原成相应的对象。(当前的dsp采用纯c++语言开发,以后将陆续地提供其它语言的sdk开发包,在适当地时候,我会提供所有的源代码)
     dsp在反序列化对象时,可以反序列化数据流成为序列化时的对象,如果序列化时的对象注册过,则可以将数据流反序列化成序列化对象的最接近的一个基类。
     dsp采用阻塞方式序列化和反序列化对象,实时地传送或接收序列化后的数据到socket或文件中,不需要经过缓冲区拷贝,大大地提高了序列化和反序列化的速度。
     dsp采用二进制数据流方式序列化数据,允许序列化后的数据中包含字符串终结符'\0',因此允许序列化任意的二进制数据、文件、图像缓冲区、音频缓冲区等。
     dsp可以传送任意大小的数据,你甚至可以在一个对象中包含一个或多个任意大小的二进制文件,dsp会自动地对数据进行分段传送,并确保数据能正确地被序列化。利用dsp可以序列化任意大小文件的特性,你可以在序列化对象时读取一个文件,通过socket传送到远端;远端读取socket数据,在反序列化数据流时,直接将传送的文件保存起来,从而实现p2p或email中传送多媒体信息的应用。
     dsp可以在序列化对象时选择是否进行crc校验、是否对数据值进行压缩处理,可以自定义压缩处理函数,并且可以指定反序列化对象后自动执行的函数集。
     dsp通过多重crc校验,保证数据不会在传送过程中被修改,为保证数据的安全性,每一类序列化对象都可以自定义压缩处理函数,在压缩处理函数内对数据进行压缩或加密,如果设定了压缩处理函数,dsp会在序列化过程中调用压缩处理函数对数据进行处理,传递压缩函数处理过后的数据;在反序列化过程中,dsp就会调用解压缩处理函数,先将接收到的数据还原,然后将数据保存到对象的相应属性中。
     dsp还允许从socket或文件中读取数据到一个已存在的指定对象中,从而确保只能从数据源得到指定的对象。
     dsp可以处理任意多层嵌套对象的序列化和反序列化,即一个可序列化对象可以是另一个可序列化对象的一个属性,并且一个可序列化对象中可以包含任意多个可序列化对象。
     dsp反序列化时,对象中的任何一个属性的值被反序列化完成后,都会发出明确的通知,可以在接到该通知后执行任意的代码。

   
                                sdk开发包的使用说明
     sdk包的内容?
     sdk包仅仅包含2个类,一个是dsp类,该类中定义了序列化和反序列化对象时的方法,以及所需要的结构,dsp类不能够被实例化,所有的方法都是静态的,dsp类的实际作用仅仅是定义一个命名空间。
     dsp类中包含有两个结构,_dsppacket和_dsperror。_dsppacket结构是序列化和反序列化时必不可少的结构,在序列化和反序列化时需要创建一个该结构的实例,然后调用结构中的方法进行序列化和反序列化操作。序列化操作的writeobject()方法和反序列化的readobject()方法都是该结构中的方法。
    _ dsperror结构中记录了最近一次错误的代码,错误的详述,以及在序列化和反序列化第几个基类的第几个属性时产生了错误。如果调用readobject()和writeobject()返回了一个错误,可以调用_dsppacket::getlasterror()返回描述该错误的_dsperror结构的指针。
     sdk包中的另一个类是dspact类,这个类是所有可以被序列化和反序列化的类的基类。
     这两个类全部都是采用纯c++语言书写的。
   
     sdk包的附带内容?
     sdk包中还带有一个dns类,该类的主要功能是查询dns服务器,得到相关的信息,这个类还在完善中。
     该类提供了一些较低级的方法来查询dns服务器,也封装了一个较高级的方法dns::_dnspacket::getmxhostset(),该方法会直接查询dns服务器,并返回包含mx记录的集合,然后可以直接调用另一个较高级的方法dns::_dnspacket::getmx()得到一个mx记录,重复调用该函数,就可以得到下一个mx记录,一直到读完为止。
     这个dns类比microsoft sdk开发包中提供的dnsquery()方法要简单的多,你只需要创建一个dns::_dnspacket结构的实例,然后调用该实例的getmxhostset()方法,传递要查询的域名即可,得到mx记录也只需要调用该实例的getmxhost()方法,该方法会返回要查询的域名的邮件服务器的hostent结构的指针。

     什么对象可以被序列化?
     由dspact类派生出来的任何一个类,或者说只要一个类的基类是dspact类,这个类就可以被序列化。就象vc++的所有可以被序列化的类必需是由cobject类派生出来的,dsp可以被序列化的类也必需是由类dspact派生出来的。
   
     什么对象可以被反序列化?
     任何由dspact类派生出来的类都可以被dsp反序列化,被反序列化的类可以预先调用dsp::registeract()函数注册该类,这样,dsp在反序列化过程时可以动态创建出被注册过的类的对象;如果类没有被注册过,也可以通过在反序列化时传递需要被反序列化的对象的指针,将数据反序列化到指定的对象中。
   
     如何对反序列化对象上溯造型?
     反序列化对象是通过调用readobject()函数来实现的,函数返回的是指向反序列化后的对象的指针,该指针固定是一个dspact对象的指针,如何知道该指针应该上溯造型成哪一个对象的指针呢?可以通过调用dspact对象的iskindof()方法,传递类名字的字符串指针,该函数会判断该对象是否是指定的类的一个对象,并返回true或false。如果方法返回true,则对象可以被安全地上溯造型为指定的对象。
     在调用dsp::registeract()方法注册类时,可以传递一个附加的32位数据值,该值可以是一个结构的指针,也可以是一个dword数据(在window系统中,可以设定成消息的id)。当对象被反序列化成功后,会返回一个dspact对象的指针,这时在_dsppacket结构中的属性dwdata中保存了该值。
   
   
   
                            dsp::_dsppacket结构说明
     类型:属性
     定义:timeval   timeout
     描述:如果序列化的数据流需要通过socket来传送,或者反序列化的数据流来自socket,则该属性有效。
          该属性设定了接收或传送时的socket超时时间,如果socket超时,则序列化或反序列化失败。
       
       
     类型:属性
     定义:dword     dwdata
     描述:在反序列化成功后,该变量内保存了registeract()方法注册类时传递的dwdata参数的值。
   
   
     类型:方法
     定义:void empty()
     参数:无
     描述:清空_dsppacket结构,为下一次反序列化作准备。序列化对象时不需要调用该方法。连续进行反序列化时不需要在每次反序列化前都调用该方法。
   
   

本文关键:序列化、反序列化、对象、MX记录、DNS、邮件服务器
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top