public void Test_Can_Serialize_All_Concrete_Payloads(Type t) { //arrange SerializerService serializer = new SerializerService(); serializer.RegisterGamePacketSerializers() .RegisterPatchPacketSerializers(); //Abstracts can't be created if (t.IsAbstract || typeof(IUnknownPayloadType).IsAssignableFrom(t)) //if it's unknown then it's probably default and thus unwritable { return; } object payload = Activator.CreateInstance(t, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, new object[0], null); //act byte[] rentedBuffer = ArrayPool <byte> .Shared.Rent(36000); //We have to suppress these exceptions because some payloads have complex object graphs and //need more than default initialization to be serializable try { int offset = WritePayload(rentedBuffer, serializer, (dynamic)payload); //assert Assert.True(offset != 0); } catch (ArgumentNullException e) { } catch (Exception e) { Assert.Warn($"Type: {t.Name} may not be serializable. It's not determinable. This can happen if it has class/complex fields and should be ignored. \n\nException: {e.Message}"); } finally { ArrayPool <byte> .Shared.Return(rentedBuffer); } }