要求解析下面字符串,得到一个对象,字符串代表一个类名和其参数 参数可能也是一个类或数组,可能需要用到嵌套算法clazz@Class{p1=v1,p2=[av21,av22],p3@Class3{p31=v31},p4=v4}请问有没有好的算法??

解决方案 »

  1.   

    没有。
    其实就是用反射,前提是:
    1、你的类都是POJO的
    2、不能使用无类型的泛型成员,例如 List不带类型参数否则,你需要另外的方式传达类的定义相关的信息。以你的字符串为例: clazz@Class{p1=v1,p2=[av21,av22],p3@Class3{p31=v31},p4=v4}
    我们可以理解成这样:
     有一个全局变量,变量名=clazz,它是一个类,类名Class
     clazz中包含4个成员 p1,p2 和 p3,p4
       p1 是个字符串,内容是 "v1"
       p2 是个字符串数组,内容是 "av21","av22"
       p3 是个类对象,类名是Class3,包含一个字符串成员 p31, 值是"v31"
       p4 是个字符串,内容是“v4”
    理解的对不对呢?不晓得,因为不晓得你的编码规则。
    假设理解基本正确,只是p1,p2,p3,p4的类型不对,可以从类的2进制代码中,根据类名和属性名获得p1p4的声明类型。
    数组是可以处理的。但是如果是List,里面可以放任何类,而且jar包中没有这个信息。所以,算法什么的还不用急着考虑,仅凭这个字符串还没有足够的信息能够恢复这个对象。
    因此,必须先说明编码规则,才能考虑解析算法
      

  2.   

    p-code:parse(ClassString){
      for each sub-ClassString in ClassString{
        parse(sub-ClassString )
      }
    }但是估计有现成的第3方包支持这类操作。
      

  3.   

    一定要用你给的例子这样的字符串么? Java本身的序列化、反序列化方案很成熟了,网络、文件都可以。代码就没有了,你的字符串应该是按照你们的私有协议编制的吧,其他公司怎么会刚好有可用的代码呢?建议你还是用JDK自带的序列化方案吧。