|
1 | 1 | // SPDX-FileCopyrightText: 2020 smdn <smdn@smdn.jp> |
2 | 2 | // SPDX-License-Identifier: MIT |
| 3 | +#if NETFRAMEWORK || NETSTANDARD2_0_OR_GREATER || NETCOREAPP2_0_OR_GREATER || NET5_0_OR_GREATER |
| 4 | +#define SYSTEM_RUNTIME_SERIALIZATION_ISERIALIZABLE |
| 5 | +#define SYSTEM_RUNTIME_SERIALIZATION_IFORMATTER |
| 6 | +#endif |
| 7 | + |
3 | 8 | using System; |
4 | 9 | using System.IO; |
| 10 | +#if SYSTEM_RUNTIME_SERIALIZATION_ISERIALIZABLE || SYSTEM_RUNTIME_SERIALIZATION_IFORMATTER |
| 11 | +using System.Runtime.Serialization; |
| 12 | +#endif |
5 | 13 | #if SYSTEM_RUNTIME_SERIALIZATION_FORMATTER_BINARY |
6 | 14 | using System.Runtime.Serialization.Formatters.Binary; |
7 | 15 | #endif |
8 | 16 |
|
9 | 17 | namespace Smdn.Test.NUnit; |
10 | 18 |
|
11 | 19 | public partial class Assert { |
12 | | - public static void IsSerializableBinaryFormat<TSerializable>(TSerializable obj) |
13 | | - /*where TSerializable : ISerializable*/ |
14 | | - => IsSerializableBinaryFormat(obj, null); |
| 20 | +#if SYSTEM_RUNTIME_SERIALIZATION_IFORMATTER |
| 21 | + private static IFormatter CreateDefaultSerializationFormatter() |
| 22 | +#if SYSTEM_RUNTIME_SERIALIZATION_FORMATTER_BINARY |
| 23 | + // TODO: use JsonSerializer instead |
| 24 | + // https://docs.microsoft.com/ja-jp/dotnet/fundamentals/syslib-diagnostics/syslib0011 |
| 25 | + => new BinaryFormatter(); |
| 26 | +#else |
| 27 | + => null; |
| 28 | +#endif |
| 29 | + |
| 30 | + private static IFormatter CreateDefaultDeserializationFormatter() |
| 31 | +#if SYSTEM_RUNTIME_SERIALIZATION_FORMATTER_BINARY && SYSTEM_RUNTIME_SERIALIZATION_SERIALIZATIONBINDER |
| 32 | + => new BinaryFormatter() { |
| 33 | + Binder = new DeserializationBinder(), |
| 34 | + }; |
| 35 | +#else |
| 36 | + => null; |
| 37 | +#endif |
| 38 | +#endif // SYSTEM_RUNTIME_SERIALIZATION_IFORMATTER |
| 39 | + |
| 40 | + public static void IsSerializable<TSerializable>( |
| 41 | + TSerializable obj, |
| 42 | + Action<TSerializable> testDeserializedObject = null |
| 43 | + ) |
| 44 | +#if SYSTEM_RUNTIME_SERIALIZATION_ISERIALIZABLE |
| 45 | + where TSerializable : ISerializable |
| 46 | +#endif |
| 47 | + => IsSerializableCore( |
| 48 | + obj, |
| 49 | +#if SYSTEM_RUNTIME_SERIALIZATION_IFORMATTER |
| 50 | + CreateDefaultSerializationFormatter(), |
| 51 | + CreateDefaultDeserializationFormatter(), |
| 52 | +#endif |
| 53 | + testDeserializedObject |
| 54 | + ); |
| 55 | + |
| 56 | +#if SYSTEM_RUNTIME_SERIALIZATION_IFORMATTER |
| 57 | + public static void IsSerializable<TSerializable>( |
| 58 | + TSerializable obj, |
| 59 | + IFormatter serializationFormatter, |
| 60 | + IFormatter deserializationFormatter, |
| 61 | + Action<TSerializable> testDeserializedObject = null |
| 62 | + ) |
| 63 | +#if SYSTEM_RUNTIME_SERIALIZATION_ISERIALIZABLE |
| 64 | + where TSerializable : ISerializable |
| 65 | +#endif |
| 66 | + => IsSerializableCore( |
| 67 | + obj, |
| 68 | + serializationFormatter ?? throw new ArgumentNullException(nameof(serializationFormatter)), |
| 69 | + deserializationFormatter ?? throw new ArgumentNullException(nameof(deserializationFormatter)), |
| 70 | + testDeserializedObject |
| 71 | + ); |
| 72 | +#endif |
15 | 73 |
|
16 | | - public static void IsSerializableBinaryFormat<TSerializable>( |
| 74 | + private static void IsSerializableCore<TSerializable>( |
17 | 75 | TSerializable obj, |
| 76 | +#if SYSTEM_RUNTIME_SERIALIZATION_IFORMATTER |
| 77 | + IFormatter serializationFormatter, |
| 78 | + IFormatter deserializationFormatter, |
| 79 | +#endif |
18 | 80 | Action<TSerializable> testDeserializedObject |
19 | 81 | ) |
20 | | - /*where TSerializable : ISerializable*/ |
| 82 | +#if SYSTEM_RUNTIME_SERIALIZATION_ISERIALIZABLE |
| 83 | + where TSerializable : ISerializable |
| 84 | +#endif |
21 | 85 | { |
22 | | -#if SYSTEM_RUNTIME_SERIALIZATION_FORMATTER_BINARY && SYSTEM_RUNTIME_SERIALIZATION_SERIALIZATIONBINDER |
23 | | - // TODO: use JsonSerializer instead |
24 | | - // https://docs.microsoft.com/ja-jp/dotnet/fundamentals/syslib-diagnostics/syslib0011 |
25 | | - var serializeFormatter = new BinaryFormatter(); |
| 86 | +#if SYSTEM_RUNTIME_SERIALIZATION_IFORMATTER |
| 87 | + if (serializationFormatter is null || deserializationFormatter is null) |
| 88 | + return; // do nothing |
26 | 89 |
|
27 | 90 | using var stream = new MemoryStream(); |
28 | 91 |
|
29 | 92 | #pragma warning disable SYSLIB0011 |
30 | | - serializeFormatter.Serialize(stream, obj); |
| 93 | + serializationFormatter.Serialize(stream, obj); |
31 | 94 | #pragma warning restore SYSLIB0011 |
32 | 95 |
|
33 | 96 | stream.Position = 0L; |
34 | 97 |
|
35 | | - var deserializeFormatter = new BinaryFormatter() { |
36 | | - Binder = new DeserializationBinder() |
37 | | - }; |
38 | | - |
39 | 98 | #pragma warning disable SYSLIB0011 |
40 | | - var deserialized = deserializeFormatter.Deserialize(stream); |
| 99 | + var deserialized = deserializationFormatter.Deserialize(stream); |
41 | 100 | #pragma warning restore SYSLIB0011 |
42 | 101 |
|
43 | 102 | IsNotNull(deserialized); |
44 | 103 | AreNotSame(obj, deserialized); |
45 | 104 | IsInstanceOf<TSerializable>(deserialized); |
46 | 105 |
|
47 | | - if (testDeserializedObject != null) |
| 106 | + if (testDeserializedObject is not null) |
48 | 107 | testDeserializedObject((TSerializable)deserialized); |
49 | 108 | #else |
50 | 109 | // do nothing |
|
0 commit comments