Indexeddb隐式密钥类型转换

时间:2015-05-03 23:41:40

标签: javascript html5 dart protocol-buffers indexeddb

我使用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);
...

此处对象仍然是一张地图,但密钥为intmergeFromJsonMap严重失败。

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的所有结果中?

0 个答案:

没有答案