Mirror of Svelto.ECS because we're a fan of it
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

56 lines
2.1KB

  1. #if DEBUG && !PROFILER
  2. using System;
  3. #endif
  4. namespace Svelto.ECS.Serialization
  5. {
  6. public interface ISerializer<T>
  7. where T : unmanaged, IEntityStruct
  8. {
  9. bool Serialize(in T value, ISerializationData serializationData);
  10. bool Deserialize(ref T value, ISerializationData serializationData);
  11. uint size { get; }
  12. }
  13. public static class SerializerExt
  14. {
  15. public static bool SerializeSafe<T>(this ISerializer<T> serializer, in T value, ISerializationData serializationData)
  16. where T : unmanaged, IEntityStruct
  17. {
  18. #if DEBUG && !PROFILER
  19. uint posBefore = serializationData.dataPos;
  20. #endif
  21. bool res = serializer.Serialize(value, serializationData);
  22. #if DEBUG && !PROFILER
  23. // size == 0 is a special case when we don't know the size in advance
  24. if (serializer.size != 0 && serializationData.dataPos != posBefore + serializer.size)
  25. {
  26. throw new IndexOutOfRangeException(
  27. $"Size mismatch when serializing {typeof(T).FullName} using {serializer.GetType().FullName}, " +
  28. $"expected offset {posBefore + serializer.size}, got {serializationData.dataPos}");
  29. }
  30. #endif
  31. return res;
  32. }
  33. public static bool DeserializeSafe<T>(this ISerializer<T> serializer, ref T value, ISerializationData serializationData)
  34. where T : unmanaged, IEntityStruct
  35. {
  36. #if DEBUG && !PROFILER
  37. uint posBefore = serializationData.dataPos;
  38. #endif
  39. bool res = serializer.Deserialize(ref value, serializationData);
  40. #if DEBUG && !PROFILER
  41. if (serializer.size != 0 && serializationData.dataPos != posBefore + serializer.size)
  42. {
  43. throw new IndexOutOfRangeException(
  44. $"Size mismatch when deserializing {typeof(T).FullName} using {serializer.GetType().FullName}, " +
  45. $"expected offset {posBefore + serializer.size}, got {serializationData.dataPos}");
  46. }
  47. #endif
  48. return res;
  49. }
  50. }
  51. }