Serialization 如何序列化余烬对象?

Serialization 如何序列化余烬对象?,serialization,deserialization,ember.js,Serialization,Deserialization,Ember.js,我需要使用localStorage来存储一些余烬对象。我注意到,Ember对象的属性名称类似于\uu ember1334992182483。当我在Ember对象上调用JSON.stringify()时,这些\uu Ember*属性不会序列化。为什么会这样?我并不是说我想序列化这些属性。我只是好奇它们到底是什么,以及它们是如何实现的,这样它们就不会被序列化 我使用cycle.js()将包含重复引用的数据结构编码为一个字符串,该字符串可用于重建原始数据结构。它允许您执行以下操作: a = {a:1}

我需要使用localStorage来存储一些余烬对象。我注意到,Ember对象的属性名称类似于
\uu ember1334992182483
。当我在Ember对象上调用
JSON.stringify()
时,这些
\uu Ember*
属性不会序列化。为什么会这样?我并不是说我想序列化这些属性。我只是好奇它们到底是什么,以及它们是如何实现的,这样它们就不会被序列化

我使用cycle.js()将包含重复引用的数据结构编码为一个字符串,该字符串可用于重建原始数据结构。它允许您执行以下操作:

a = {a:1}
b = {b:1}
c = [[a, b], [b, a]]

foo = JSON.stringify(JSON.decycle(c))  // "[[{'a':1},{'b':1}],[{'$ref':'$[0][1]'},{'$ref':'$[0][0]'}]]"
JSON.retrocycle(JSON.parse(foo))  // reconstruct c
对于Ember对象,我可以做同样的事情,但我还需要将反序列化的对象传递到
Ember.Object.create()
,因为它们被反序列化为普通JavaScript对象


这是序列化/反序列化余烬对象的最佳方法吗?有推荐的技术吗?

我会使用余烬数据并为此编写数据存储适配器

对于序列化和反序列化,您可以按照以下方式进行操作,请参见:

App.Serializable=Ember.Mixin.create({
序列化:函数(){
var propertyNames=this.get('propertyNames')| |[];
返回此.getProperties(propertyNames);
},
反序列化:函数(哈希){
这个.setProperties(散列);
}
});
App.Person=Ember.Object.extend(App.Serializable{
propertyNames:'firstName title fullName'.w(),
全名:函数(){
返回“%@”.fmt(this.get('title')、this.get('firstName');
}.property('firstName','title')
});
var hansi=App.Person.create({
名字:“汉斯”,
标题:“先生”
});
//{名字:'汉斯',头衔:'汉斯先生',全名:'汉斯先生'}
log(hansi.serialize());
var hubert=App.Person.create();
休伯特:反序列化({
名字:“休伯特”,
标题:“先生”
});
log(hubert.serialize());​

更新:再看看类似的问题

我有:

  • 固定和简化代码
  • 增加了循环参考预防
  • 增值的附加用途
  • 已删除空组件的所有默认属性

    //Modified by Shimon Doodkin 
    //Based on answers of: @leo, @pangratz, @kevin-pauli, @Klaus
    //http://stackoverflow.com/questions/8669340
    
    App.Jsonable = Em.Mixin.create({
        getJson : function (keysToSkip, visited) {
            //getJson() called with no arguments,
            // they are to pass on values during recursion.
    
            if (!keysToSkip)
                keysToSkip = Object.keys(Ember.Component.create());
    
            if (!visited)
                visited = [];
    
            visited.push(this);
    
            var getIsFunction;
    
            var jsonValue = function (attr, key, obj) {
                if (Em.isArray(attr))
                    return attr.map(jsonValue);
                if (App.Jsonable.detect(attr))
                    return attr.getJson(keysToSkip, visited);
                return getIsFunction?obj.get(key):attr;
            };
    
            var base;
            if (!Em.isNone(this.get('jsonProperties')))
                base = this.getProperties(this.get('jsonProperties'));
            else
                base = this;
    
            getIsFunction=Em.typeOf(base.get) === 'function';
    
            var json = {};
    
            var hasProp = Object.prototype.hasOwnProperty;
    
            for (var key in base) {
    
                if (!hasProp.call(base, key) || keysToSkip.indexOf(key) != -1)
                    continue;
    
                var value = base[key];
    
                // there are usual circular references
                // on keys: ownerView, controller, context === base
    
                if ( value === base ||
                     value === 'toString' ||
                     Em.typeOf(value) === 'function')
                    continue;
    
                // optional, works also without this,
                // the rule above if value === base covers the usual case
                if (visited.indexOf(value) != -1)
                    continue;
    
                json[key] = jsonValue(value, key, base);
    
            }
    
            visited.pop();
            return json;
        }
    });
    
    /*
    example:
    
    DeliveryInfoInput = Ember.Object.extend(App.Jsonable,{
     jsonProperties: ["title","value","name"], //Optionally specify properties for json
     title:"",
     value:"",
     input:false,
     textarea:false,
     size:22,
     rows:"",
     name:"",
     hint:""
    })
    */
    

为什么
\uuu ember*
属性不在
JSON.stringify()
的输出中?我不得不在这里猜测,因为我不是JavaScript专家:但是如果在
ember.Object
上为(obj中的prop){}执行
操作,未列出
\uu ember*
,对
对象hasOwnProperty
的检查仅对定义的属性返回true,请参阅。
\uu ember*
属性未在
for…in
循环中列出。执行
App.obj.hasOwnProperty(“\uu ember1335029963”)
返回
true