Changeset 464


Ignore:
Timestamp:
02/07/16 04:09:36 (9 years ago)
Author:
Maciej Komosinski
Message:

Serialization of basic object types in JSON format

Location:
cpp/frams
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • cpp/frams/param/param.cpp

    r426 r464  
    296296                ExtValue ex;
    297297                get(i, ex);
    298                 ws = SString(SERIALIZATION_PREFIX) + ex.serialize();
     298                ws = SString(SERIALIZATION_PREFIX) + ex.serialize(NativeSerialization);
    299299        }
    300300        else
  • cpp/frams/util/extvalue.cpp

    r414 r464  
    183183}
    184184
    185 SString ExtObject::serialize_inner() const
     185SString ExtObject::serialize_inner(SerializationFormat format) const
    186186{
    187187        int ref = tlsGetRef(ExtObject_serialization).add(*this);
     188        SString ret;
     189
    188190        if (ref >= 0)
    189                 return SString::sprintf("^%d", ref);
     191                {
     192                switch(format)
     193                        {
     194                        case NativeSerialization: return SString::sprintf("^%d", ref);
     195                        case JSONSerialization: return SString("null");
     196                        }
     197                }
    190198
    191199        if (isEmpty()) return SString("null");
     200        {
    192201        VectorObject *vec = VectorObject::fromObject(*this, false);
    193202        if (vec)
    194                 return vec->serialize();
     203                { ret=vec->serialize(format); goto finally; }
     204        }
     205        {
    195206        DictionaryObject *dic = DictionaryObject::fromObject(*this, false);
    196207        if (dic)
    197                 return dic->serialize();
     208                { ret=dic->serialize(format); goto finally; }
     209        }
     210        {
    198211        Param tmp_param;
    199212        ParamInterface *p = getParamInterface(tmp_param);
     
    204217        {
    205218                ExtObject o(p->getObject(m));
    206                 SString ret = SString(interfaceName()) + o.serialize();
    207                 return ret;
     219                switch(format)
     220                        {
     221                        case NativeSerialization: ret=SString(interfaceName())+o.serialize(format); break;
     222                        case JSONSerialization: ret=SString::sprintf("{\"class\":\"%s\",\"data\":%s}",interfaceName(),o.serialize(format).c_str()); break;
     223                        }
     224                goto finally;
    208225        }
    209226        m = p->findId("toString");
     
    212229                SString str = p->getString(m);
    213230                sstringQuote(str);
    214                 SString ret = SString(interfaceName()) + "\"" + str + "\"";
    215                 return ret;
     231                switch(format)
     232                        {
     233                        case NativeSerialization: ret=SString(interfaceName())+"\"" +str+"\""; break;
     234                        case JSONSerialization: ret=SString::sprintf("{\"class\":\"%s\",\"data\":\"%s\"}",interfaceName(),str.c_str()); break;
     235                        }
     236                goto finally;
     237        }
    216238        }
    217239
    218240        tlsGetRef(ExtObject_serialization).remove(*this);//undo nonserializable reference
    219         SString ret = interfaceName();
    220         ret += SString::sprintf("<%p>", object ? object : paraminterface);
     241        switch(format)
     242                {
     243                case NativeSerialization: return SString(interfaceName())+SString::sprintf("<%p>",object ? object : paraminterface); break;
     244                case JSONSerialization: return SString::sprintf("{\"class\":\"%s\"}",interfaceName()); break;
     245                }
     246
     247  finally: // not 100% "finally", the case of nonserializable reference (directly above) returns directly without going through finally
     248
     249        switch(format)
     250                {
     251                case JSONSerialization:
     252                        tlsGetRef(ExtObject_serialization).remove(*this);//JSON only tracks recursion, does not track reuse
     253                        break;
     254                }
     255
    221256        return ret;
    222257}
    223258
    224 SString ExtObject::serialize() const
     259SString ExtObject::serialize(SerializationFormat format) const
    225260{
    226261        tlsGetRef(ExtObject_serialization).begin();
    227         SString ret = serialize_inner();
     262        SString ret = serialize_inner(format);
    228263        tlsGetRef(ExtObject_serialization).end();
    229264        return ret;
     
    874909}
    875910
    876 SString ExtValue::serialize() const
     911SString ExtValue::serialize(SerializationFormat format) const
    877912{
    878913        switch (type)
     
    889924                return SString::valueOf(ddata());
    890925        case TObj:
    891                 return odata().serialize();
     926                return odata().serialize(format);
    892927        case TInvalid:
    893                 return SString("invalid");
     928                if (format==NativeSerialization)
     929                        return SString("invalid");
     930                // else null --v
    894931        default:
    895932                return SString("null");
  • cpp/frams/util/extvalue.h

    r384 r464  
    3232        virtual ~DestrBase() {}
    3333};
     34
     35enum SerializationFormat { NativeSerialization, JSONSerialization };
    3436
    3537/**
     
    7577
    7678        SString toString() const;
    77         SString serialize_inner() const;
    78         SString serialize() const;
     79        SString serialize_inner(SerializationFormat format) const;
     80        SString serialize(SerializationFormat format) const;
    7981
    8082        ExtObject(Param *p, void *o) :subtype(2), object(o), param(p){}
     
    194196        SString getString() const;
    195197        const SString* getStringPtr() const;//< @return pointer to the internal sstring object or NULL if the current type is not string
    196         SString serialize() const;
     198        SString serialize(SerializationFormat format) const;
    197199        ExtObject getObject() const;
    198200        bool isNull() const { return (type == TUnknown) || ((type == TObj) && odata().isEmpty()); }
  • cpp/frams/vm/classes/collectionobj.cpp

    r453 r464  
    154154}
    155155
    156 SString VectorObject::serialize() const
     156SString VectorObject::serialize(SerializationFormat format) const
    157157{
    158158SString out="[";
     
    163163                if (i) out+=",";
    164164                if (v)
    165                         out+=v->serialize();
     165                        out+=v->serialize(format);
    166166                else
    167167                        out+="null";
     
    413413}
    414414
    415 SString DictionaryObject::serialize() const
     415SString DictionaryObject::serialize(SerializationFormat format) const
    416416{
    417417SString out="{";
     
    424424                out+="\":";
    425425                if (it->value!=NULL)
    426                         out+=((ExtValue*)it->value)->serialize();
     426                        out+=((ExtValue*)it->value)->serialize(format);
    427427                else
    428428                        out+="null";
  • cpp/frams/vm/classes/collectionobj.h

    r453 r464  
    4242static void p_new(void*,ExtValue*args,ExtValue*ret)
    4343        {ret->setObject(ExtObject(&par,new VectorObject));}
    44 SString serialize() const;
     44SString serialize(SerializationFormat format) const;
    4545ExtObject makeObject() {return ExtObject(&par,this);}
    4646
     
    7373PARAMPROCDEF(p_clone);
    7474#undef STATRICKCLASS
    75 SString serialize() const;
     75SString serialize(SerializationFormat format) const;
    7676static void p_new(void*,ExtValue*args,ExtValue*ret)
    7777        {ret->setObject(ExtObject(&par,new DictionaryObject));}
Note: See TracChangeset for help on using the changeset viewer.