title: Typescript, serialize class objects
body: <p>How do I serialize these classes to JSON? </p>
  
  <p>As you can see from the example below <code>JSON.stringify()</code> does not serialize the list of <code>Cache_Backend_LocalStorage_Tag</code> inside the <code>Cache_Backend_LocalStorage_TagThree</code> object.</p>
  
  <p>What am I missing?</p>
  
  <pre><code>interface Cache_Backend_LocalStorage_Tag_Interface {
      _tag : string;
      _keys : string[];
  }
  
  class Cache_Backend_LocalStorage_Tag implements Cache_Backend_LocalStorage_Tag_Interface {
  
      public _tag : string;
      public _keys : string[];
  
      constructor(tag : string) {
          this._tag = tag;
  
          this._keys = [];
      }
  
      public add(key : string) : void {
          this._keys.push(key);   
      }
  
      public remove(key : string): boolean {
          // Get the index of the key
          var index = this._keys.indexOf(key, 0);
  
          // Check if we found the keys index
          if (index != undefined) {
             this._keys.splice(index, 1);
  
             return true;
          }
  
          return false;
      }
  
      public get tag(): string {
          return this._tag;
      }
  
      public get keys(): string[] {
          return this._keys;
      }
  }
  
  interface Cache_Backend_LocalStorage_TagThree_Interface {
      _tags : Cache_Backend_LocalStorage_Tag[];
  }
  
  class Cache_Backend_LocalStorage_TagThree implements Cache_Backend_LocalStorage_TagThree_Interface {
  
      public _tags : Cache_Backend_LocalStorage_Tag[];
  
      constructor(tags : Cache_Backend_LocalStorage_Tag[] = []) {
          this._tags = tags;
      }
  
      public add(tag : Cache_Backend_LocalStorage_Tag) : void {
          this.tags[tag.tag] = tag;
      }
  
      public get tags(): Cache_Backend_LocalStorage_Tag[] {
          return this._tags;
      }
  
      public get(tagKey : string): Cache_Backend_LocalStorage_Tag {
          return this.tags[tagKey];
      }
  
      public addKeyToTag(tagKey, key) {
          this.tags[tagKey].add(key);
      }
  
      public removeKeyFromTag(tagKey, key) {
          // Get the tag
          var tag = this._tags[tagKey];
  
          // Check if we found the tag index
          if (tag != undefined) {
              return tag.remove(key);
          }
  
          return false;
      }
  
      public clear(tagKey : string): void {
          delete this._tags[tagKey];
      }
  
      public static fromObject(object): Cache_Backend_LocalStorage_TagThree {
          return new Cache_Backend_LocalStorage_TagThree(object._tags);
      }
  }
  </code></pre>
  
  <p>Issue:</p>
  
  <pre><code>var tagThree = new Cache_Backend_LocalStorage_TagThree();
  tagThree.add(new Cache_Backend_LocalStorage_Tag("stores"));
  tagThree.addKeyToTag("stores", "store5");
  tagThree.removeKeyFromTag("stores", "store5");
  
  //  {"_tags":[]}
  console.log(JSON.stringify(tagThree));
  
  // { _tags: [ stores: { _tag: 'stores', _keys: [Object] } ] }
  console.log(tagThree);
  </code></pre>