StorableMultArray.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace Island.StandardLib.Storage
  5. {
  6. /// <summary>
  7. /// 表示一个每项长度不固定的可序列化变长数组(不定项长可变数组)
  8. /// </summary>
  9. public class StorableMultArray : IStorable
  10. {
  11. List<MultData> array;
  12. /// <summary>
  13. /// 初始化不定项长可变数组
  14. /// </summary>
  15. public StorableMultArray()
  16. {
  17. array = new List<MultData>();
  18. }
  19. public StorableMultArray DeepCopy()
  20. {
  21. StorableMultArray newArray = new StorableMultArray();
  22. for (int i = 0; i < Length; i++)
  23. newArray.Add(this[i].DeepCopy());
  24. return newArray;
  25. }
  26. public void ReadFromData(DataStorage data)
  27. {
  28. data.ReadUncheck(out int size);
  29. for (int i = 0; i < size; i++)
  30. array.Add(new MultData(data.Read()));
  31. }
  32. public void WriteToData(DataStorage data)
  33. {
  34. data.WriteUncheck(array.Count);
  35. for (int i = 0; i < array.Count; i++)
  36. data.Write(array[i].Data);
  37. }
  38. public override bool Equals(object obj)
  39. {
  40. StorableMultArray other = obj as StorableMultArray;
  41. if (other == null) return false;
  42. if (other.Length != Length) return false;
  43. for (int i = 0; i < Length; i++)
  44. if (!other[i].Equals(this[i])) return false;
  45. return true;
  46. }
  47. public void Add(IStorable data) => array.Add(new MultData(data));
  48. public void Add(MultData data) => array.Add(data);
  49. public void Add(byte[] data) => array.Add(new MultData(data));
  50. public void RemoveAt(int index) => array.RemoveAt(index);
  51. public void Clear() => array.Clear();
  52. public int Count => array.Count;
  53. public int Size => array.Count;
  54. public int Length => array.Count;
  55. public MultData this[int index] => array[index];
  56. }
  57. /// <summary>
  58. /// 表示一个不定项长可变数组的项
  59. /// </summary>
  60. public class MultData
  61. {
  62. public byte[] Data;
  63. public MultData DeepCopy()
  64. {
  65. byte[] b = new byte[Data.Length];
  66. Array.Copy(Data, b, b.Length);
  67. return new MultData(b);
  68. }
  69. public MultData(byte[] data) => Data = data;
  70. public MultData(int data) => Data = BitConverter.GetBytes(data);
  71. public MultData(char data) => Data = BitConverter.GetBytes(data);
  72. public MultData(bool data) => Data = BitConverter.GetBytes(data);
  73. public MultData(float data) => Data = BitConverter.GetBytes(data);
  74. public MultData(string data) => Data = Encoding.UTF8.GetBytes(data);
  75. public MultData(long data) => Data = BitConverter.GetBytes(data);
  76. public MultData(uint data) => Data = BitConverter.GetBytes(data);
  77. public MultData(ulong data) => Data = BitConverter.GetBytes(data);
  78. public MultData(double data) => Data = BitConverter.GetBytes(data);
  79. public MultData(IStorable data)
  80. {
  81. DataStorage ds = new DataStorage();
  82. data.WriteToData(ds);
  83. Data = ds.Bytes;
  84. }
  85. public override bool Equals(object obj)
  86. {
  87. MultData other = obj as MultData;
  88. if (other == null) return false;
  89. return other.Data.ByteEquals(Data);
  90. }
  91. public int AsInt() => BitConverter.ToInt32(Data, 0);
  92. public char AsChar() => BitConverter.ToChar(Data, 0);
  93. public bool AsBool() => BitConverter.ToBoolean(Data, 0);
  94. public float AsFloat() => BitConverter.ToSingle(Data, 0);
  95. public string AsString() => Encoding.UTF8.GetString(Data);
  96. public long AsLong() => BitConverter.ToInt64(Data, 0);
  97. public uint AsUInt() => BitConverter.ToUInt32(Data, 0);
  98. public ulong AsULong() => BitConverter.ToUInt64(Data, 0);
  99. public double AsDouble() => BitConverter.ToDouble(Data, 0);
  100. public T As<T>() where T : IStorable, new() => Data.ReadData<T>();
  101. public override int GetHashCode()
  102. {
  103. return BitConverter.ToInt32(Data.Hash16(), 0);
  104. }
  105. }
  106. }