public static string Serialize(ArmaArray array) { var data = new StringBuilder(); data.Append("["); if (array == null) { data.Append("]"); return(data.ToString()); } foreach (var d in array) { if (d is string) { data.Append("\""); var s = d as string; data.Append(s); data.Append("\""); } else if (d is int || d is double || d is bool) { data.Append(d); } else if (d is ArmaArray) { var a = d as ArmaArray; data.Append(Serialize(a)); } data.Append(","); } if (data[data.Length - 1] == ',') { data.Length--; } data.Append("]"); return(data.ToString()); }
public Request(string request) { var parts = request.Split(Manager.Seperator); switch (parts[0].ToUpper()) { case "SET": _command = Commands.Set; break; case "GETSYNC": _command = Commands.GetSync; break; case "GETASYNC": _command = Commands.GetAsync; break; case "DEL": _command = Commands.Del; break; case "EXPIRE": _command = Commands.Expire; break; case "GETBIT": _command = Commands.GetBit; break; case "RESPONSE": _command = Commands.Response; break; default: throw new RequestException("Unknown packet type"); break; } try { switch (_command) { case Commands.Set: _table = parts[1].ToUpper(); _instanceId = parts[2]; _expiry = Convert.ToInt32(parts[3]); _data = ArmaArray.Unserialize(parts[4]); break; case Commands.GetSync: case Commands.GetAsync: case Commands.Del: _table = parts[1].ToUpper(); _instanceId = parts[2]; break; case Commands.Expire: _table = parts[1].ToUpper(); _instanceId = parts[2]; _expiry = Convert.ToInt32(parts[3]); break; case Commands.GetBit: _table = parts[1].ToUpper(); _instanceId = parts[2]; _bit = Convert.ToInt32(parts[3]); break; case Commands.Response: _tid = Convert.ToInt32(parts[1]); _part = Convert.ToInt32(parts[2]); break; } } catch (Exception ex) { throw new RequestException(String.Format("Request Error: {0} - {1}", ex.Message, request)); } }
public static ArmaArray Unserialize(string strarray) { if (strarray.ElementAt(0) != '[') { throw new ArmaArrayException("String does not start with a ["); } strarray = strarray.Substring(1); var array = new ArmaArray(); var nums = new[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.', '-', 'e' }; for (var i = 0; i < strarray.Length; i++) { switch (strarray[i]) { case '[': { var str = new StringBuilder(); var inArr = 0; while (true) { if (strarray[i] == '[') { inArr++; } if (strarray[i] == ']') { inArr--; } str.Append(strarray[i]); i++; if (inArr == 0) { break; } } List <object> innerArray = Unserialize(str.ToString()); array.Add(innerArray); } break; case '"': { var str = new StringBuilder(); var isEnd = false; i++; while (true) { try { if (strarray[i] == '"') { isEnd = !isEnd; } } catch { break; } if (isEnd && (strarray[i] == ',' || strarray[i] == ']')) { break; } str.Append(strarray[i]); i++; } array.Add(str.ToString().TrimEnd('"')); } break; default: if (nums.Contains(strarray[i])) { var str = new StringBuilder(); var isFloat = false; while (nums.Contains(strarray[i])) { if (strarray[i] == '.') { isFloat = true; } str.Append(strarray[i]); i++; } if (isFloat) { var num = Convert.ToDouble(str.ToString()); array.Add(num); } else { var num = Convert.ToInt32(str.ToString()); array.Add(num); } } else if (Substring(strarray, i, 4).ToLower() == "true") { array.Add(true); i = i + 4; } else if (Substring(strarray, i, 5).ToLower() == "false") { array.Add(false); i = i + 5; } break; } } return(array); }