【发布时间】:2014-02-28 17:44:40
【问题描述】:
name:key:dataLength:data 格式的字符串,这些字符串通常可以链接在一起。例如 "aNum:n:4:9879aBool:b:1:taString:s:2:Hi" 这将映射到类似的对象:
{
aNum: 9879,
aBool: true,
aString: "Hi"
}
我有一种解析这种格式的字符串的方法,但我不确定是否使用substring 是处理字符串的最有效方式,是否有更有效的方式以这种方式处理字符串(反复砍掉前面的部分):
Map<string, dynamic> fromString(String s){
Map<String, dynamic> _internal = new Map();
int start = 0;
while(start < s.length){
int end;
List<String> parts = new List<String>(); //0 is name, 1 is key, 2 is data length, 3 is data
for(var i = 0; i < 4; i++){
end = i < 3 ? s.indexOf(':') : num.parse(parts[2]);
parts[i] = s.substring(start, end);
start = i < 3 ? end + 1 : end;
}
var tranType = _tranTypesByKey[parts[1]]; //this is just a map to an object which has a function that can convert the data section of the string into an object
_internal[parts[0]] = tranType._fromStr(parts[3]);
}
return _internal;
}
【问题讨论】:
-
您能否提供有关此类字符串的预期大小或您希望一次处理多少此类字符串的信息。这取决于很多这样的信息,什么策略是有意义的,或者花时间进行优化是否有意义。
-
字符串的数据部分在大小和内容方面绝对可以是任何东西,并且这些对象的链接也可能是巨大的,我不希望它们成为我使用它们的个人原因只会使用小型简单对象,但类应支持具有任意数量属性的对象。
-
那么您也可以考虑使用流进行异步处理并使用Finite State Machine 进行解析,因此您不需要同时在内存中拥有多个副本。您也可以在仍在接收数据时开始处理数据。对于小块可能会慢一些,但对于大数据可能会更快。
-
为什么不直接使用 json 或 ProtocolBuffers 和现有的解析器呢? (当然,前提是您可以决定将哪种格式用于编码数据)