最近做一个应用,socket的客户端,使用一种自定义的数据组装格式。
首先考虑是把发送的东西写成对象,比起直接拼字符串应该是好很多。
这样的话就要考虑,如何把对象,按照指定的格式拼装成一串字符,以及如何把接收到的字符串拼装成一个对象。
最开始的时候设想,每个传送的对象,重写toString()方法,来把自身格式化。
接着,觉得这么多对象,每个对象一个类似的方法,代码冗余太多。
于是想写一个基础对象,在里面写toString()方法,然后让其他的传送对象继承这个基础对象。
考虑到子类继承父类的方法,再访问子类的自身属性等等这么多东西,写的时候干脆另外写了一个encoder类,用于传送对象的编码。
写了一个静态编码方法,接受一个Object参数,再用反射来获得自身的类,字段,以及字段类型,再把字段根据类型组装好,返回一个完成编码的String。
写好了一跑,发现不行~~!
原因是,Class的getFields()方法只能获得public的字段,而传送的对象是标准bean写法,一个私有的成员属性加两个public的get和set,这样,反射就读不到字段了。
第二个原因,getFields()获得所有的公开字段,但是不保证顺序!而格式协议上是规定好的顺序,乱不得。
想了想,修改这个静态编码方法的参数为Object...args,变长Object列表,这样来保证顺序,使用的时候,需要把对象的属性给依次传递过来,Encoder.parseRequest(request.getNumber(),request.getUser(),request.getPass());
这样,编码程序终于能正常工作了~~然后考虑解码问题
首先考虑是把发送的东西写成对象,比起直接拼字符串应该是好很多。
这样的话就要考虑,如何把对象,按照指定的格式拼装成一串字符,以及如何把接收到的字符串拼装成一个对象。
最开始的时候设想,每个传送的对象,重写toString()方法,来把自身格式化。
接着,觉得这么多对象,每个对象一个类似的方法,代码冗余太多。
于是想写一个基础对象,在里面写toString()方法,然后让其他的传送对象继承这个基础对象。
考虑到子类继承父类的方法,再访问子类的自身属性等等这么多东西,写的时候干脆另外写了一个encoder类,用于传送对象的编码。
写了一个静态编码方法,接受一个Object参数,再用反射来获得自身的类,字段,以及字段类型,再把字段根据类型组装好,返回一个完成编码的String。
写好了一跑,发现不行~~!
原因是,Class的getFields()方法只能获得public的字段,而传送的对象是标准bean写法,一个私有的成员属性加两个public的get和set,这样,反射就读不到字段了。
第二个原因,getFields()获得所有的公开字段,但是不保证顺序!而格式协议上是规定好的顺序,乱不得。
想了想,修改这个静态编码方法的参数为Object...args,变长Object列表,这样来保证顺序,使用的时候,需要把对象的属性给依次传递过来,Encoder.parseRequest(request.getNumber(),request.getUser(),request.getPass());
这样,编码程序终于能正常工作了~~然后考虑解码问题