扫描已有对象并使其生成一定格式的类(一)

1.初代方案 最近公司需要为某产品增加类似快照的功能,因此需要找出相应类中的成员并对其进行序列化,如果人工一个一个找肯定是不切实际的,因此给出了第一种方案,最简单也最快捷,脚本。 在实际操作中也对python进行了研究,因为python在目前生产环境中不太友好,因此直接用shell脚本冲了它,先附上

1.初代方案

最近公司需要为某产品增加类似快照的功能,因此需要找出相应类中的成员并对其进行序列化,如果人工一个一个找肯定是不切实际的,因此给出了第一种方案,最简单也最快捷,脚本。

在实际操作中也对python进行了研究,因为python在目前生产环境中不太友好,因此直接用shell脚本冲了它,先附上代码,后面有空在解释,为了达到目的,设计了一些比较绕的字符处理,总的来说还是比较有技巧性的。

涉及机密的用*** 代替

#!/bin/bash                                                                                                                                    
IFS=$'\n\n' 
MACRONAME="ZH_ZH" 

declare -A ARG_TYPE

for var in `grep $MACRONAME ./***/ -R -n`
do
tempvar=${var#*//}
if [ "$var" != "$tempvar" ];then
    continue
fi

echo -e "\033[31m start analysis\033[0m $var"
filePath=${var%%:*}
currDir=${filePath%/*}
fullfilename=${filePath##*/}
fileName=${fullfilename%.*}
serialFileName=$fileName"Serial.cpp"
lineNo=${var%:*}
lineNo=${lineNo#*:} 
vars=${var%)*}
vars=${vars#*(}
fileHead=`head -$lineNo $filePath`
fileEnd=$(cat $filePath | tail -n +$lineNo) 
classHead=${fileHead##*class}
classHead=${classHead%$vars*}
classEnd=${fileEnd%%class*}
classEnd=${classEnd#*$vars}
class=$classHead$classEnd
className=`echo $classHead | awk '{print $1}'`

echo "$class" > $currDir/$fileName

vars=`echo $vars | sed 's/[[:space:]]//g'`

OLD_IFS="$IFS"
IFS=","
array=($vars)
IFS="$OLD_IFS"
for a in ${array[@]}
do
    for res in `grep -r $a $currDir/$fileName`
    do  
        res=${res%$a*}
        res=`echo $res | sed -e 's/^[ \t]*//g'`
        ARG_TYPE[$a]=$res
    done
done

rm $currDir/$fileName

echo "$className::Save(const savestore& b)" > $currDir/$serialFileName
echo "{" >> $currDir/$serialFileName
for res in ${!ARG_TYPE[@]}
do
    echo "    ***::Save<${ARG_TYPE[$res]}>($res,b);" >> $currDir/$serialFileName
done
echo "}" >> $currDir/$serialFileName

echo "$className::$className(const savestore& b)" >> $currDir/$serialFileName
echo "{" >> $currDir/$serialFileName
for res in ${!ARG_TYPE[@]}
do
    echo "    ***::Load<${ARG_TYPE[$res]}>($res,b);" >> $currDir/$serialFileName
done
echo "}" >> $currDir/$serialFileName

done

echo -e "\033[33mAnalysis complete\033[0m"