SerializableEnum.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using Newtonsoft.Json;
  2. using XGame.Framework.Serialization;
  3. namespace etoy
  4. {
  5. /// <summary>
  6. /// 序列化用枚举对象
  7. /// 不能反序列化
  8. /// </summary>
  9. class SerializableEnum : ISerializable
  10. {
  11. public string fieldType;
  12. public string fieldName;
  13. public bool isRepeated;
  14. public string value;
  15. public MetadataStruct meta;
  16. void ISerializable.Deserialize(IReader reader)
  17. {
  18. throw new NotImplementedException();
  19. }
  20. void ISerializable.Serialize(IWriter writer)
  21. {
  22. if (isRepeated)
  23. {
  24. int[] enumIntVals = null;
  25. try
  26. {
  27. enumIntVals = JsonConvert.DeserializeObject<int[]>(value);
  28. }
  29. catch (Exception ex)
  30. {
  31. Console.WriteLine($"枚举数组转int[]失败 Type:{fieldType} Name:{fieldName} Value:{value} Message:{ex.Message}");
  32. }
  33. if (enumIntVals == null)
  34. {
  35. var enumVals = JsonConvert.DeserializeObject<string[]>(value);
  36. var count = enumVals?.Length ?? 0;
  37. enumIntVals = new int[count];
  38. for (int i = 0; i < count; i++)
  39. {
  40. if (!int.TryParse(enumVals[i], out var intVal))
  41. { // 存的是枚举的名字
  42. var field = meta.Fields.First(a => a.Name.Equals(enumVals[i], StringComparison.OrdinalIgnoreCase));
  43. intVal = field?.EnumIntVal ?? 0;
  44. }
  45. enumIntVals[i] = intVal;
  46. }
  47. }
  48. writer.Write(enumIntVals);
  49. }
  50. else
  51. {
  52. if (!int.TryParse(value, out var intVal))
  53. { // value存的是枚举的名字
  54. var field = meta.Fields.First(a => a.Name.Equals(value, StringComparison.OrdinalIgnoreCase));
  55. intVal = field?.EnumIntVal ?? 0;
  56. }
  57. writer.Write(intVal);
  58. }
  59. }
  60. }
  61. }