#if DEBUG && !PROFILER using System; #endif namespace Svelto.ECS.Serialization { public interface ISerializer where T : unmanaged, IEntityStruct { bool Serialize(in T value, ISerializationData serializationData); bool Deserialize(ref T value, ISerializationData serializationData); uint size { get; } } public static class SerializerExt { public static bool SerializeSafe(this ISerializer serializer, in T value, ISerializationData serializationData) where T : unmanaged, IEntityStruct { #if DEBUG && !PROFILER uint posBefore = serializationData.dataPos; #endif bool res = serializer.Serialize(value, serializationData); #if DEBUG && !PROFILER // size == 0 is a special case when we don't know the size in advance if (serializer.size != 0 && serializationData.dataPos != posBefore + serializer.size) { throw new IndexOutOfRangeException( $"Size mismatch when serializing {typeof(T).FullName} using {serializer.GetType().FullName}, " + $"expected offset {posBefore + serializer.size}, got {serializationData.dataPos}"); } #endif return res; } public static bool DeserializeSafe(this ISerializer serializer, ref T value, ISerializationData serializationData) where T : unmanaged, IEntityStruct { #if DEBUG && !PROFILER uint posBefore = serializationData.dataPos; #endif bool res = serializer.Deserialize(ref value, serializationData); #if DEBUG && !PROFILER if (serializer.size != 0 && serializationData.dataPos != posBefore + serializer.size) { throw new IndexOutOfRangeException( $"Size mismatch when deserializing {typeof(T).FullName} using {serializer.GetType().FullName}, " + $"expected offset {posBefore + serializer.size}, got {serializationData.dataPos}"); } #endif return res; } } }