Guest User

Untitled

a guest
Jan 19th, 2018
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.82 KB | None | 0 0
  1. using GameSparks.Core;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6.  
  7. public class GSDataHelpers {
  8.  
  9. /** Converts a serializable object into GameSparks compatible GSData. */
  10. public static GSData ObjectToGSData(object obj) {
  11. GSRequestData gsData = new GSRequestData();
  12. gsData.AddString("type", obj.GetType().ToString());
  13.  
  14. foreach(var field in obj.GetType().GetFields()) {
  15. if(!field.IsNotSerialized && field.GetValue(obj) != null) {
  16. if(field.FieldType == typeof(string)) {
  17. gsData.AddString(field.Name, field.GetValue(obj).ToString());
  18. } else if(field.FieldType == typeof(bool)) {
  19. gsData.AddBoolean(field.Name, bool.Parse(field.GetValue(obj).ToString()));
  20. } else if(field.FieldType == typeof(int)) {
  21. gsData.AddNumber(field.Name, (int)Convert.ToInt32(field.GetValue(obj)));
  22. } else if(field.FieldType == typeof(float) || field.GetValue(obj).GetType() == typeof(double)) {
  23. gsData.AddNumber(field.Name, Double.Parse(field.GetValue(obj).ToString()));
  24. } else if(field.FieldType == typeof(List<string>) || field.GetValue(obj).GetType() == typeof(string[])) {
  25. gsData.AddStringList(field.Name, (field.FieldType == typeof(List<string>)) ? field.GetValue(obj) as List<string> : new List<string>(field.GetValue(obj) as string[]));
  26. } else if(field.FieldType == typeof(List<int>) || field.GetValue(obj).GetType() == typeof(int[])) {
  27. gsData.AddNumberList(field.Name, (field.FieldType == typeof(List<int>)) ? field.GetValue(obj) as List<int> : new List<int>(field.GetValue(obj) as int[]));
  28. } else if(field.FieldType == typeof(List<float>) || field.GetValue(obj).GetType() == typeof(float[])) {
  29. gsData.AddNumberList(field.Name, (field.FieldType == typeof(List<float>)) ? field.GetValue(obj) as List<float> : new List<float>(field.GetValue(obj) as float[]));
  30. } else if(field.FieldType == typeof(DateTime)) {
  31. gsData.AddDate(field.Name, (DateTime)field.GetValue(obj));
  32. } else if(field.FieldType.IsClass && !field.FieldType.IsGenericType) {
  33. gsData.AddObject(field.Name, ObjectToGSData(field.GetValue(obj)));
  34. } else if (field.FieldType.IsGenericType && field.FieldType.GetGenericTypeDefinition() == typeof(List<>) || field.FieldType.IsArray) {
  35. List<GSData> gsDataList = new List<GSData>();
  36. foreach(var elem in field.GetValue(obj) as IList) {
  37. gsDataList.Add(ObjectToGSData(elem));
  38. }
  39. gsData.AddObjectList(field.Name, gsDataList);
  40. }
  41. }
  42. }
  43.  
  44. Debug.LogWarning(gsData.JSON);
  45. return gsData;
  46. }
  47.  
  48. /** Converts GSData to the corresponding class. */
  49. public static object GSDataToObject(GSData gsData) {
  50. Debug.LogWarning(gsData.JSON);
  51.  
  52. Type objType = Type.GetType(gsData.GetString("type"));
  53. object obj = Activator.CreateInstance(objType);
  54. foreach(var typeField in objType.GetFields()) {
  55. if(!typeField.IsNotSerialized && gsData.ContainsKey(typeField.Name)) {
  56. if(typeField.FieldType == typeof(string)) {
  57. typeField.SetValue(obj, gsData.GetString(typeField.Name));
  58. } else if(typeField.FieldType == typeof(int)) {
  59. typeField.SetValue(obj, (int)gsData.GetNumber(typeField.Name).Value);
  60. } else if(typeField.FieldType == typeof(float)) {
  61. typeField.SetValue(obj, (float)gsData.GetFloat(typeField.Name).Value);
  62. } else if(typeField.FieldType == typeof(bool)) {
  63. typeField.SetValue(obj, gsData.GetBoolean(typeField.Name));
  64. } else if(typeField.FieldType == typeof(DateTime)) {
  65. typeField.SetValue(obj, gsData.GetDate(typeField.Name));
  66. } else if((typeField.FieldType == typeof(List<string>) || typeField.FieldType == typeof(string[]) )) {
  67. typeField.SetValue(obj, (typeField.FieldType == typeof(List<string>)) ? (object)gsData.GetStringList(typeField.Name) : gsData.GetStringList(typeField.Name).ToArray());
  68. } else if((typeField.FieldType == typeof(List<int>) || typeField.FieldType == typeof(int[]))) {
  69. typeField.SetValue(obj, (typeField.FieldType == typeof(List<int>)) ? (object)gsData.GetIntList(typeField.Name) : gsData.GetIntList(typeField.Name).ToArray());
  70. } else if((typeField.FieldType == typeof(List<float>) || typeField.FieldType == typeof(float[]))) {
  71. typeField.SetValue(obj, (typeField.FieldType == typeof(List<float>)) ? (object)gsData.GetFloatList(typeField.Name) : gsData.GetFloatList(typeField.Name).ToArray());
  72. } else if(typeField.FieldType.IsClass && !typeField.FieldType.IsGenericType && !typeField.FieldType.IsArray) {
  73. typeField.SetValue(obj, GSDataToObject(gsData.GetGSData(typeField.Name)));
  74. } else if(!typeField.FieldType.IsArray && typeof(IList).IsAssignableFrom(typeField.FieldType)) {
  75. IList genericList = Activator.CreateInstance(typeField.FieldType) as IList;
  76. foreach(GSData gsDataElem in gsData.GetGSDataList(typeField.Name)) {
  77. object elem = GSDataToObject(gsDataElem);
  78. genericList.Add(elem);
  79. }
  80. typeField.SetValue(obj, genericList);
  81. } else if(typeField.FieldType.IsArray) {
  82. List<GSData> gsArrayData = gsData.GetGSDataList(typeField.Name);
  83. // create a new instance of the array. The Activator class cannot do this for arrays //
  84. // so this will create a new array of types inside the array, with the count of what is in the gsdata list //
  85. Array newArray = Array.CreateInstance(typeField.FieldType.GetElementType(), gsArrayData.Count);
  86. object[] objArray = new object[gsArrayData.Count]; // create a new array of objects where the serialized objects will be kept
  87. for(int i = 0; i < gsArrayData.Count; i++) {
  88. objArray[i] = GSDataToObject(gsArrayData[i]); // convert the JSON data inside the list to an object
  89. }
  90. Array.Copy(objArray, newArray, objArray.Length); //covert the object[] to the original type
  91. typeField.SetValue(obj, newArray);
  92. }
  93. }
  94. }
  95.  
  96. return obj;
  97. }
  98.  
  99. /** Returns the size of the data in bytes. */
  100. public static int SizeOfGSData(GSData data) {
  101. return data.JSON.Length * sizeof(char);
  102. }
  103. }
Add Comment
Please, Sign In to add comment