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"