一直有个想法。SuperObject这么好用的Json简析类,序列化出来的Json排序是乱的。
有时候想用SuperObject做保存树数据。这样一来排序都是乱乱的也就放弃了,这几天想改造一下SuperObject类。
将改造过程记下。以便以后查阅。
最初想法
增加ISuperObject属性SortMode:Integer排序方式(0:默认方式, 1:添加顺序, 2:升序)
缺点:
因为每个值都是一个TSuperObject对象。如果每个TSuperObject添加SortMode属性, 考虑的地方太多。
开始认为默认的方式是安装降序排列的,后来深入代码发现通过下面的方法计算key的值再进行比较得出进行排序。
class function TSuperAvlEntry.Hash(const k: SOString): Cardinal;
var
h: cardinal;
i: Integer;
s: string;
begin
h := 0;
//modify mofen without case
s := LowerCase(k);
for i := 1 to Length(s) do
begin
//origial
h := h * 129 + ord(s[i]) + $9E370001;
//h := h + ord(s[i]) * (1 shl (i * 3));
end;
Result := h;
end;
从上面代码可以看出如果字母多,肯定比字母计算出来的Hash值要大。
--此方案不妥