Uploaded image for project: 'Thrift'
  1. Thrift
  2. THRIFT-1976

Javascript client unable to serialize/deserialize maps with struct keys

    XMLWordPrintableJSON

Details

    Description

      The Javascript compiler is unable to serialize maps where a struct is a key due to particularities with how Javascript treats {} objects.

      Using the following thrift definition:

      struct Foo {
          1: required string name;
      }
      
      struct Bar {
          1: required string description;
      }
      
      struct Mapper {
          1: required map<Foo,Bar> fooToBar;
      }
      
      

      It produces the following javascript code:

      Mapper.prototype.write = function(output) {
        output.writeStructBegin('Mapper');
        if (this.fooToBar !== null && this.fooToBar !== undefined) {
          output.writeFieldBegin('fooToBar', Thrift.Type.MAP, 1); 
          output.writeMapBegin(Thrift.Type.STRUCT, Thrift.Type.STRUCT, Thrift.objectLength(this.fooToBar));
          // XXX
          // This will always fail as kiter8 will always be a String
          // XXX
          for (var kiter8 in this.fooToBar)
          {   
            if (this.fooToBar.hasOwnProperty(kiter8))
            {   
              var viter9 = this.fooToBar[kiter8];
              // kiter8 is a string, not an object.
              kiter8.write(output);
              viter9.write(output);
            }   
          }   
          output.writeMapEnd();
          output.writeFieldEnd();
        }
        output.writeFieldStop();
        output.writeStructEnd();
        return;
      };
      

      This code always fails since enumeration of an object's keys will always yield String values. I've annotated the relevant parts in the above code.

      There isn't really a simple fix for this either: Using for-in, there is no way to get a reference to the original key object. Practically, a Map type would have to be added to the thrift library with basic put()/get()/delete() operations to allow for struct maps.

      Attachments

        Activity

          People

            codesf Randy Abernethy
            refefer Andrew Stanton
            Votes:
            2 Vote for this issue
            Watchers:
            6 Start watching this issue

            Dates

              Created:
              Updated: