Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
FormatterServices.cs
Go to the documentation of this file.
7using System.Text;
8
10
11public static class FormatterServices
12{
14
15 [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2075:UnrecognizedReflectionPattern", Justification = "The Type is annotated with All, which will preserve base type fields.")]
17 {
18 if (type.IsInterface)
19 {
20 return Array.Empty<FieldInfo>();
21 }
22 if (!type.IsSerializable)
23 {
24 throw new SerializationException(System.SR.Format(System.SR.Serialization_NonSerType, type.FullName, type.Assembly.FullName));
25 }
27 Type baseType = type.BaseType;
28 if (baseType != null && baseType != typeof(object))
29 {
33 if (parentTypeCount > 0)
34 {
36 for (int i = 0; i < parentTypeCount; i++)
37 {
39 if (!baseType.IsSerializable)
40 {
41 throw new SerializationException(System.SR.Format(System.SR.Serialization_NonSerType, baseType.FullName, baseType.Module.Assembly.FullName));
42 }
43 FieldInfo[] fields = baseType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
44 string namePrefix = (parentTypes2 ? baseType.Name : baseType.FullName);
45 FieldInfo[] array2 = fields;
46 foreach (FieldInfo fieldInfo in array2)
47 {
48 if (!fieldInfo.IsNotSerialized)
49 {
51 }
52 }
53 }
54 if (list != null && list.Count > 0)
55 {
56 FieldInfo[] array3 = new FieldInfo[list.Count + array.Length];
57 Array.Copy(array, array3, array.Length);
58 list.CopyTo(array3, array.Length);
59 array = array3;
60 }
61 }
62 }
63 return array;
64 }
65
67 {
68 FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
69 int num = 0;
70 for (int i = 0; i < fields.Length; i++)
71 {
72 if ((fields[i].Attributes & FieldAttributes.NotSerialized) != FieldAttributes.NotSerialized)
73 {
74 num++;
75 }
76 }
77 if (num != fields.Length)
78 {
79 FieldInfo[] array = new FieldInfo[num];
80 num = 0;
81 for (int j = 0; j < fields.Length; j++)
82 {
83 if ((fields[j].Attributes & FieldAttributes.NotSerialized) != FieldAttributes.NotSerialized)
84 {
85 array[num] = fields[j];
86 num++;
87 }
88 }
89 return array;
90 }
91 return fields;
92 }
93
95 {
96 parentTypes = null;
98 bool flag = true;
99 Type typeFromHandle = typeof(object);
101 while (type != typeFromHandle)
102 {
103 if (!type.IsInterface)
104 {
105 string name = type.Name;
106 int num = 0;
107 while (flag && num < parentTypeCount)
108 {
109 string name2 = parentTypes[num].Name;
110 if (name2.Length == name.Length && name2[0] == name[0] && name == name2)
111 {
112 flag = false;
113 break;
114 }
115 num++;
116 }
117 if (parentTypes == null || parentTypeCount == parentTypes.Length)
118 {
119 Array.Resize(ref parentTypes, Math.Max(parentTypeCount * 2, 12));
120 }
122 }
123 type = type.BaseType;
124 }
125 return flag;
126 }
127
132
134 {
135 if (type == null)
136 {
137 throw new ArgumentNullException("type");
138 }
139 return s_memberInfoTable.GetOrAdd(new MemberHolder(type, context), (MemberHolder mh) => InternalGetSerializableMembers(mh._memberType));
140 }
141
143 {
144 }
145
150
155
156 internal static void SerializationSetValue(MemberInfo fi, object target, object value)
157 {
159 {
160 fieldInfo.SetValue(target, value);
161 return;
162 }
164 }
165
166 public static object PopulateObjectMembers(object obj, MemberInfo[] members, object?[] data)
167 {
168 if (obj == null)
169 {
170 throw new ArgumentNullException("obj");
171 }
172 if (members == null)
173 {
174 throw new ArgumentNullException("members");
175 }
176 if (data == null)
177 {
178 throw new ArgumentNullException("data");
179 }
180 if (members.Length != data.Length)
181 {
183 }
184 for (int i = 0; i < members.Length; i++)
185 {
187 if (memberInfo == null)
188 {
190 }
191 object obj2 = data[i];
192 if (obj2 != null)
193 {
195 {
197 }
198 fieldInfo.SetValue(obj, data[i]);
199 }
200 }
201 return obj;
202 }
203
204 public static object?[] GetObjectData(object obj, MemberInfo[] members)
205 {
206 if (obj == null)
207 {
208 throw new ArgumentNullException("obj");
209 }
210 if (members == null)
211 {
212 throw new ArgumentNullException("members");
213 }
214 object[] array = new object[members.Length];
215 for (int i = 0; i < members.Length; i++)
216 {
218 if (memberInfo == null)
219 {
221 }
223 if (fieldInfo == null)
224 {
226 }
227 array[i] = fieldInfo.GetValue(obj);
228 }
229 return array;
230 }
231
240
241 [RequiresUnreferencedCode("Types might be removed")]
242 public static Type? GetTypeFromAssembly(Assembly assem, string name)
243 {
244 if (assem == null)
245 {
246 throw new ArgumentNullException("assem");
247 }
248 return assem.GetType(name, throwOnError: false, ignoreCase: false);
249 }
250
252 {
254 }
255
257 {
258 try
259 {
261 }
262 catch (Exception)
263 {
264 }
265 return null;
266 }
267
269 {
270 if (type == null)
271 {
272 throw new ArgumentNullException("type");
273 }
274 Type type2 = type;
275 while (type2.HasElementType)
276 {
277 type2 = type2.GetElementType();
278 }
279 object[] customAttributes = type2.GetCustomAttributes(typeof(TypeForwardedFromAttribute), inherit: false);
280 int num = 0;
281 if (num < customAttributes.Length)
282 {
285 return ((TypeForwardedFromAttribute)attribute).AssemblyFullName;
286 }
287 hasTypeForwardedFrom = false;
288 return type.Assembly.FullName;
289 }
290
291 internal static string GetClrTypeFullName(Type type)
292 {
293 if (!type.IsArray)
294 {
296 }
298 }
299
300 private static string GetClrTypeFullNameForArray(Type type)
301 {
302 int arrayRank = type.GetArrayRank();
303 string clrTypeFullName = GetClrTypeFullName(type.GetElementType());
304 if (arrayRank != 1)
305 {
306 return clrTypeFullName + "[" + new string(',', arrayRank - 1) + "]";
307 }
308 return clrTypeFullName + "[]";
309 }
310
312 {
313 if (!type.IsGenericType)
314 {
315 return type.FullName;
316 }
317 StringBuilder stringBuilder = new StringBuilder(type.GetGenericTypeDefinition().FullName).Append('[');
318 Type[] genericArguments = type.GetGenericArguments();
319 foreach (Type type2 in genericArguments)
320 {
321 stringBuilder.Append('[').Append(GetClrTypeFullName(type2)).Append(", ");
322 stringBuilder.Append(GetClrAssemblyName(type2, out var _)).Append("],");
323 }
324 return stringBuilder.Remove(stringBuilder.Length - 1, 1).Append(']').ToString();
325 }
326}
static unsafe void Copy(Array sourceArray, Array destinationArray, int length)
Definition Array.cs:624
bool ICollection< KeyValuePair< TKey, TValue > >. Remove(KeyValuePair< TKey, TValue > keyValuePair)
static byte Max(byte val1, byte val2)
Definition Math.cs:738
static Assembly Load(string assemblyString)
Definition Assembly.cs:157
static object GetUninitializedObject([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors|DynamicallyAccessedMemberTypes.NonPublicConstructors)] Type type)
static FieldInfo[] InternalGetSerializableMembers([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type)
static ISerializationSurrogate GetSurrogateForCyclicalReference(ISerializationSurrogate innerSurrogate)
static string GetClrTypeFullNameForNonArrayTypes(Type type)
static Assembly LoadAssemblyFromStringNoThrow(string assemblyName)
static MemberInfo[] GetSerializableMembers([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type, StreamingContext context)
static object PopulateObjectMembers(object obj, MemberInfo[] members, object?[] data)
static void CheckTypeSecurity(Type t, TypeFilterLevel securityLevel)
static bool GetParentTypes(Type parentType, out Type[] parentTypes, out int parentTypeCount)
static string GetClrAssemblyName(Type type, out bool hasTypeForwardedFrom)
static FieldInfo[] GetSerializableFields([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields|DynamicallyAccessedMemberTypes.NonPublicFields)] Type type)
static void SerializationSetValue(MemberInfo fi, object target, object value)
static ? Type GetTypeFromAssembly(Assembly assem, string name)
static object GetUninitializedObject([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors|DynamicallyAccessedMemberTypes.NonPublicConstructors)] Type type)
static object GetSafeUninitializedObject([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors|DynamicallyAccessedMemberTypes.NonPublicConstructors)] Type type)
static readonly ConcurrentDictionary< MemberHolder, MemberInfo[]> s_memberInfoTable
static ? object[] GetObjectData(object obj, MemberInfo[] members)
static Assembly LoadAssemblyFromString(string assemblyName)
static MemberInfo[] GetSerializableMembers([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type)
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string Argument_InvalidFieldInfo
Definition SR.cs:28
static string ArgumentNull_NullMember
Definition SR.cs:20
static string Serialization_UnknownMemberInfo
Definition SR.cs:22
static string Serialization_NonSerType
Definition SR.cs:16
static string Argument_DataLengthDifferent
Definition SR.cs:18
Definition SR.cs:7
StringBuilder Append(char value, int repeatCount)