我使用Dart将Protobuf GeneratedMessage
存储到Dartium上的Indexeddb中。但是某处(在Indexeddb里面?)我的Map
键的类型发生了变化,我想知道原因。
如果您没有尝试添加Dart对象,那么添加到数据库就可以了:
...
var database = ...
var transaction = database.transaction('myStore', 'readwrite');
var store = transaction.objectStore('myStore');
var jsonMap = myMessage.writeToJsonMap();
store.put(jsonMap, myKey)
.then((key) => print("Key added to database ${key}"))
.catchError((e) => print(e));
...
jsonMap
的类型为Map<String,dynamic>
。 GenericMessage
中的int键转换为String
。
在阅读结果时,这是不同的:
...
store.getObject(myKey).then((object) {
var message = new MyGeneratedMessage();
message.mergeFromJsonMap(object);
...
此处对象仍然是一张地图,但密钥为int
,mergeFromJsonMap
严重失败。
Exception: Uncaught Error: type 'int' is not a subtype of type 'String' of 'source'.
为了解决这个问题,我目前正在更改密钥类型时将结果副本复制到新地图中。
...
var clonedMap = new Map<String, dynamic>();
object.forEach((key, value) {
clonedMap[key.toString()] = value;
});
...
我的问题是:为什么会这样?这是预期的行为吗?这是JavaScripts
穷人类型系统的结果吗?这是一个已知的错误?
这是尝试根据ECMA-262 § 11.2.1优化Indexeddb中应该使用JavaScript的已使用存储吗?如果所有对象键都隐式转换为String
,那么这种情况是否会发生在Indexeddb的所有结果中?