public override TMap ReadMapBegin()
		{
			var map = new TMap();
			map.KeyType = (TType) ReadByte();
			map.ValueType = (TType) ReadByte();
			map.Count = ReadI32();

			return map;
		}
		public override void WriteMapBegin(TMap map)
		{
			WriteByte((byte) map.KeyType);
			WriteByte((byte) map.ValueType);
			WriteI32(map.Count);
		}
		public abstract void WriteMapBegin(TMap map);
		public override TMap ReadMapBegin()
		{
			var map = new TMap();
			ReadJSONArrayStart();
			map.KeyType = GetTypeIDForTypeName(ReadJSONString(false));
			map.ValueType = GetTypeIDForTypeName(ReadJSONString(false));
			map.Count = (int) ReadJSONInteger();
			ReadJSONObjectStart();
			return map;
		}
		public override void WriteMapBegin(TMap map)
		{
			WriteJSONArrayStart();
			WriteJSONString(GetTypeNameForTypeID(map.KeyType));
			WriteJSONString(GetTypeNameForTypeID(map.ValueType));
			WriteJSONInteger(map.Count);
			WriteJSONObjectStart();
		}
 /**
  * Write a map header. If the map is empty, omit the key and value type
  * headers, as we don't need any additional information to skip it.
  */
 public override void WriteMapBegin(TMap map)
 {
     if (map.Count == 0)
     {
         WriteByteDirect(0);
     }
     else
     {
         WriteVarint32((uint)map.Count);
         WriteByteDirect(getCompactType(map.KeyType) << 4 | getCompactType(map.ValueType));
     }
 }