1using System.Reflection;
2using System.Runtime.CompilerServices;
15#pragma warning disable CS0649
19#pragma warning restore CS0649
48 UseObjectInfo = !type.GetTypeInfo().IsValueType && type != typeof(
string);
59 throw new InvalidOperationException(
60 $
"Type {Type.FullName} is not serializable. Type must have an associated ISerializer<T> or implement ISerializable."
79 return Activator.CreateInstance(
Type,
true);
81 object uninitializedObject = RuntimeHelpers.GetUninitializedObject(
Type);
85 return uninitializedObject;
89 ConstructorInfo constructor = type.GetConstructor(
90 BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
95 if (constructor ==
null
96 && type.BaseType !=
null) {
117 protected Archive(
int version,
object context) {
122 protected void Reset(
int version,
object context) {
133 SerializeData serializeData =
new(useObjectInfo, autoConstruct);
135 value.MergeOptionsFrom(serializeData);
215 if (allowEmptySerializer || value.Read !=
null) {
218 throw new InvalidOperationException($
"ISerializer suitable for type \"{type.FullName}\" not found in any loaded assembly.");
225 foreach (TypeInfo definedType
in item.DefinedTypes) {
226 foreach (Type implementedInterface
in definedType.ImplementedInterfaces) {
227 if (implementedInterface.IsConstructedGenericType
228 && implementedInterface.GetGenericTypeDefinition() == typeof(ISerializer<>)) {
229 Type type = implementedInterface.GenericTypeArguments[0];
230 if (type.IsGenericParameter) {
233 if (!definedType.IsGenericType
234 || !definedType.IsGenericTypeDefinition) {
237 if (serializeData !=
null) {
242 else if (type.GetTypeInfo().BaseType != typeof(Array)
243 && type != typeof(Array)
244 && !type.GetTypeInfo().IsEnum) {
256 if (type.GetTypeInfo().ImplementedInterfaces.Contains(typeof(
ISerializable))) {
262 if (type.GetTypeInfo().IsEnum) {
263 Type enumUnderlyingType = type.GetEnumUnderlyingType();
264 if (enumUnderlyingType == typeof(
int)
265 || enumUnderlyingType == typeof(uint)) {
268 if (enumUnderlyingType == typeof(
long)
269 || enumUnderlyingType == typeof(ulong)) {
272 throw new InvalidOperationException(
"Unsupported underlying enum type.");
274 if (type.GetTypeInfo().IsGenericType) {
275 Type genericTypeDefinition = type.GetGenericTypeDefinition();
280 if (type.GetTypeInfo().BaseType !=
null
283 serializeData.Type = type;
287 serializeData.ConstructorSearched =
false;
288 return serializeData;
295 .GetDeclaredMethod(
"CreateSerializeDataForSerializableHelper")
296 .MakeGenericMethod(type)
303 MethodInfo methodInfo = serializerType.AsType()
306 delegate(MethodInfo m) {
307 if (m.Name !=
"Serialize") {
310 ParameterInfo[] parameters2 = m.GetParameters();
311 return parameters2.Length == 2
313 && parameters2[1].ParameterType == type.MakeByRefType();
316 MethodInfo methodInfo2 = serializerType.AsType()
319 delegate(MethodInfo m) {
320 if (m.Name !=
"Serialize") {
323 ParameterInfo[] parameters = m.GetParameters();
324 return parameters.Length == 2 && parameters[0].ParameterType == typeof(
OutputArchive) && parameters[1].ParameterType == type;
327 if (methodInfo !=
null
328 && methodInfo2 !=
null) {
329 object obj = Activator.CreateInstance(serializerType.AsType());
330 Type type2 = typeof(ReadDelegateGeneric<>).MakeGenericType(type);
331 Type type3 = typeof(WriteDelegateGeneric<>).MakeGenericType(type);
332 Delegate @delegate = methodInfo.CreateDelegate(type2, obj);
333 Delegate delegate2 = methodInfo2.CreateDelegate(type3, obj);
335 .GetDeclaredMethod(
"CreateSerializeDataForSerializerHelper")
336 .MakeGenericMethod(type)
337 .Invoke(
null, [@delegate, delegate2]);
339 throw new InvalidOperationException($
"Serialization methods not found in {serializerType.Name}");
344 serializeData.ReadGeneric = delegate(
InputArchive archive, ref T value) { value.Serialize(archive); };
345 serializeData.WriteGeneric = delegate(
OutputArchive archive, T value) { value.Serialize(archive); };
347 serializeData.Read = delegate(
InputArchive archive, ref
object value) {
349 val.Serialize(archive);
354 serializeData.Read = delegate(
InputArchive archive, ref
object value) { ((T)value).Serialize(archive); };
356 serializeData.Write = delegate(
OutputArchive archive,
object value) { ((T)value).Serialize(archive); };
358 return serializeData;
368 T value2 = ((value !=
null) ? ((T)value) :
default(T));
369 readDelegateGeneric(archive, ref value2);
372 Write = delegate(
OutputArchive archive,
object value) { writeDelegateGeneric(archive, (T)value); }
379 if (serializationOptionsAttribute !=
null) {
380 serializeData.UseObjectInfo = serializationOptionsAttribute.
UseObjectInfo;
381 serializeData.AutoConstruct = serializationOptionsAttribute.
AutoConstruct;
WriteDelegateGeneric< T > WriteGeneric
ReadDelegateGeneric< T > ReadGeneric
ConstructorInfo Constructor
void VerifySerializable()
ConstructorInfo FindConstructor(Type type)
void MergeOptionsFrom(SerializeData serializeData)
bool IsHumanReadableSupported
AutoConstructMode AutoConstruct
SerializeData(bool useObjectInfo, AutoConstructMode autoConstruct)
static SerializeData GetSerializeData(Type type, bool allowEmptySerializer)
static Dictionary< Type, SerializeData > m_pendingOptionsByType
static SerializeData CreateSerializeDataForSerializer(TypeInfo serializerType, Type type)
static object CreateInstance(Type type)
delegate void WriteDelegateGeneric< T >(OutputArchive archive, T value)
void Reset(int version, object context)
static SerializeData CreateSerializeDataForSerializableHelper< T >()
static SerializeData CreateSerializeDataForSerializable(Type type)
static HashSet< Assembly > m_scannedAssemblies
delegate void WriteDelegate(OutputArchive archive, object value)
static SerializeData CreateSerializeDataForSerializerHelper< T >(Delegate readDelegate, Delegate writeDelegate)
delegate void ReadDelegate(InputArchive archive, ref object value)
static Dictionary< Type, SerializeData > m_serializeDataByType
static void ApplySerializationOptionsAttribute(SerializeData serializeData, TypeInfo attributeTarget)
static void SetTypeSerializationOptions(Type type, bool useObjectInfo, AutoConstructMode autoConstruct)
static void ScanAssembliesForSerializers()
static void AddSerializeData(SerializeData serializeData)
delegate void ReadDelegateGeneric< T >(InputArchive archive, ref T value)
static SerializeData CreateSerializeData(Type type)
static Dictionary< Type, TypeInfo > m_genericSerializersByType
static bool IsTypeSerializable(Type type)
Archive(int version, object context)
static bool IsTypeSupported(Type type)
AutoConstructMode AutoConstruct
static bool IsKnownSystemAssembly(Assembly assembly)
static ReadOnlyList< Assembly > LoadedAssemblies