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

Serialization of basic object types in JSON format

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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");
Note: See TracChangeset for help on using the changeset viewer.