Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ObjectWriter.cs
Go to the documentation of this file.
3
5
6internal sealed class ObjectWriter
7{
9
11
12 private int _currentId;
13
15
16 private readonly StreamingContext _context;
17
19
21
22 private long _topId;
23
24 private readonly InternalFE _formatterEnums;
25
26 private readonly SerializationBinder _binder;
27
29
31
32 internal object[] _crossAppDomainArray;
33
34 private object _previousObj;
35
36 private long _previousId;
37
39
41
43
44 private readonly SerStack _niPool = new SerStack("NameInfo Pool");
45
47
57
58 [RequiresUnreferencedCode("ObjectWriter requires unreferenced code")]
60 {
61 if (graph == null)
62 {
63 throw new ArgumentNullException("graph");
64 }
65 if (serWriter == null)
66 {
67 throw new ArgumentNullException("serWriter");
68 }
70 serWriter.WriteBegin();
71 long num = 0L;
77 num = -1L;
80 object next;
81 long objID;
82 while ((next = GetNext(out objID)) != null)
83 {
85 if (next is WriteObjectInfo)
86 {
88 }
89 else
90 {
93 }
98 writeObjectInfo.ObjectEnd();
99 }
100 serWriter.WriteSerializationHeaderEnd();
101 serWriter.WriteEnd();
103 }
104
105 [RequiresUnreferencedCode("ObjectWriter requires unreferenced code")]
107 {
108 object obj = objectInfo._obj;
109 if (obj == null)
110 {
111 throw new ArgumentNullException("objectInfo._obj");
112 }
113 Type objectType = objectInfo._objectType;
114 long objectId = objectInfo._objectId;
115 if ((object)objectType == Converter.s_typeofString)
116 {
118 _serWriter.WriteObjectString((int)objectId, obj.ToString());
119 return;
120 }
121 if (objectInfo._isArray)
122 {
124 return;
125 }
128 {
133 }
135 for (int i = 0; i < outMemberTypes.Length; i++)
136 {
139 {
140 if (outMemberData[i] != null)
141 {
143 array[i]._assemId = GetAssemblyId(array[i]);
144 }
145 else
146 {
148 array[i]._assemId = GetAssemblyId(array[i]);
149 }
150 }
151 }
153 }
154
155 [RequiresUnreferencedCode("ObjectWriter requires unreferenced code")]
157 {
158 int num = memberNames.Length;
159 if (memberNameInfo != null)
160 {
163 }
164 else if ((object)objectInfo._objectType != Converter.s_typeofString)
165 {
168 }
169 if (memberNameInfo._isParentTypeOnObject)
170 {
173 }
174 else
175 {
177 }
178 for (int i = 0; i < num; i++)
179 {
181 }
182 if (memberNameInfo != null)
183 {
186 }
187 else if ((object)objectInfo._objectType != Converter.s_typeofString)
188 {
190 }
191 }
192
193 [RequiresUnreferencedCode("ObjectWriter requires unreferenced code")]
209
210 [RequiresUnreferencedCode("ObjectWriter requires unreferenced code")]
212 {
213 Type type = memberNameInfo._type;
214 bool assignUniqueIdToValueType = false;
215 if ((object)type == Converter.s_typeofObject || Nullable.GetUnderlyingType(type) != null)
216 {
219 }
221 {
225 }
227 {
228 return;
229 }
230 Type type2 = null;
231 if (memberTypeNameInfo._primitiveTypeEnum == InternalPrimitiveTypeE.Invalid)
232 {
234 if ((object)type != type2)
235 {
238 }
239 }
240 if ((object)type == Converter.s_typeofObject)
241 {
244 if (memberObjectInfo == null)
245 {
247 }
248 else
249 {
251 }
252 }
253 if (memberObjectInfo != null && memberObjectInfo._isArray)
254 {
256 if (num > 0)
257 {
260 return;
261 }
266 objectInfo.ObjectEnd();
267 }
269 {
270 if (type2 == null)
271 {
273 }
275 if (num2 < 0)
276 {
282 memberObjectInfo.ObjectEnd();
283 }
284 else
285 {
288 }
289 }
290 }
291
292 [RequiresUnreferencedCode("ObjectWriter requires unreferenced code")]
294 {
295 bool flag = false;
296 if (memberNameInfo == null)
297 {
299 flag = true;
300 }
302 long objectId = objectInfo._objectId;
304 Array array = (Array)objectInfo._obj;
305 Type objectType = objectInfo._objectType;
306 Type elementType = objectType.GetElementType();
308 if (!elementType.IsPrimitive)
309 {
312 }
314 nameInfo._isArray = nameInfo._type.IsArray;
317 nameInfo2._isArray = true;
319 nameInfo._transmitTypeOnMember = memberNameInfo._transmitTypeOnMember;
320 nameInfo._transmitTypeOnObject = memberNameInfo._transmitTypeOnObject;
321 nameInfo._isParentTypeOnObject = memberNameInfo._isParentTypeOnObject;
322 int rank = array.Rank;
323 int[] array2 = new int[rank];
324 int[] array3 = new int[rank];
325 int[] array4 = new int[rank];
326 for (int i = 0; i < rank; i++)
327 {
328 array2[i] = array.GetLength(i);
329 array3[i] = array.GetLowerBound(i);
330 array4[i] = array.GetUpperBound(i);
331 }
333 if ((object)elementType == Converter.s_typeofByte && rank == 1 && array3[0] == 0)
334 {
336 return;
337 }
339 {
342 }
344 {
347 }
348 switch (internalArrayTypeE)
349 {
350 case InternalArrayTypeE.Single:
351 {
353 if (Converter.IsWriteAsByteArray(nameInfo._primitiveTypeEnum) && array3[0] == 0)
354 {
355 break;
356 }
357 object[] array5 = null;
358 if (!elementType.IsValueType)
359 {
360 array5 = (object[])array;
361 }
362 int num = array4[0] + 1;
363 for (int k = array3[0]; k < num; k++)
364 {
365 if (array5 == null)
366 {
368 }
369 else
370 {
372 }
373 }
375 break;
376 }
377 case InternalArrayTypeE.Jagged:
378 {
382 for (int l = array3[0]; l < array4[0] + 1; l++)
383 {
385 }
387 break;
388 }
389 default:
390 {
393 bool flag2 = false;
394 for (int j = 0; j < rank; j++)
395 {
396 if (array2[j] == 0)
397 {
398 flag2 = true;
399 break;
400 }
401 }
402 if (!flag2)
403 {
405 }
407 break;
408 }
409 }
412 if (flag)
413 {
415 }
416 }
417
418 [RequiresUnreferencedCode("ObjectWriter requires unreferenced code")]
420 {
423 {
424 return;
425 }
426 NameInfo nameInfo = null;
427 Type type = null;
428 bool flag = false;
429 if (arrayElemTypeNameInfo._transmitTypeOnMember)
430 {
431 flag = true;
432 }
433 if (!flag && !arrayElemTypeNameInfo.IsSealed)
434 {
435 type = GetType(data);
436 if ((object)arrayElemTypeNameInfo._type != type)
437 {
438 flag = true;
439 }
440 }
441 if (flag)
442 {
443 if (type == null)
444 {
445 type = GetType(data);
446 }
452 }
453 else
454 {
457 }
459 {
460 bool assignUniqueIdToValueType = false;
462 {
464 }
466 if (num < 1)
467 {
475 writeObjectInfo.ObjectEnd();
476 }
477 else
478 {
480 }
481 }
482 if (arrayElemTypeNameInfo._transmitTypeOnMember)
483 {
485 }
486 }
487
488 [RequiresUnreferencedCode("ObjectWriter requires unreferenced code")]
490 {
491 int[] array2 = new int[rank];
492 int[] array3 = null;
493 bool flag = false;
494 if (lowerBoundA != null)
495 {
496 for (int i = 0; i < rank; i++)
497 {
498 if (lowerBoundA[i] != 0)
499 {
500 flag = true;
501 }
502 }
503 }
504 if (flag)
505 {
506 array3 = new int[rank];
507 }
508 bool flag2 = true;
509 while (flag2)
510 {
511 flag2 = false;
512 if (flag)
513 {
514 for (int j = 0; j < rank; j++)
515 {
516 array3[j] = array2[j] + lowerBoundA[j];
517 }
519 }
520 else
521 {
523 }
524 for (int num = rank - 1; num > -1; num--)
525 {
526 if (array2[num] < maxA[num] - 1)
527 {
528 array2[num]++;
529 if (num < rank - 1)
530 {
531 for (int k = num + 1; k < rank; k++)
532 {
533 array2[k] = 0;
534 }
535 }
536 flag2 = true;
537 break;
538 }
539 }
540 }
541 }
542
543 private object GetNext(out long objID)
544 {
545 if (_objectQueue.Count == 0)
546 {
547 objID = 0L;
548 return null;
549 }
550 object obj = _objectQueue.Dequeue();
551 object obj2 = ((obj is WriteObjectInfo) ? ((WriteObjectInfo)obj)._obj : obj);
553 if (firstTime)
554 {
556 }
557 return obj;
558 }
559
560 private long InternalGetId(object obj, bool assignUniqueIdToValueType, Type type, out bool isNew)
561 {
562 if (obj == _previousObj)
563 {
564 isNew = false;
565 return _previousId;
566 }
568 if (type != null && type.IsValueType && !assignUniqueIdToValueType)
569 {
570 isNew = false;
571 return -1 * _currentId++;
572 }
573 _currentId++;
574 long id = _idGenerator.GetId(obj, out isNew);
576 _previousId = id;
577 return id;
578 }
579
580 private long Schedule(object obj, bool assignUniqueIdToValueType, Type type)
581 {
583 }
584
586 {
587 long num = 0L;
588 if (obj != null)
589 {
591 if (isNew && num > 0)
592 {
594 }
595 }
596 return num;
597 }
598
600 {
601 if ((object)typeNameInfo._type == Converter.s_typeofString)
602 {
604 }
605 else
606 {
607 if (typeNameInfo._primitiveTypeEnum == InternalPrimitiveTypeE.Invalid)
608 {
609 return false;
610 }
611 if (typeNameInfo._isArray)
612 {
614 }
615 else
616 {
618 }
619 }
620 return true;
621 }
622
627
629 {
630 bool isNew = true;
631 long num = -1L;
633 {
635 }
637 if (isNew || num < 0)
638 {
640 }
641 else
642 {
644 }
645 }
646
648 {
649 bool flag = data == null;
650 if (flag && (_formatterEnums._serializerTypeEnum == InternalSerializerTypeE.Binary || memberNameInfo._isArrayItem || memberNameInfo._transmitTypeOnObject || memberNameInfo._transmitTypeOnMember || objectInfo._isSi || CheckTypeFormat(_formatterEnums._typeFormat, FormatterTypeStyle.TypesAlways)))
651 {
652 if (typeNameInfo._isArrayItem)
653 {
654 if (typeNameInfo._arrayEnum == InternalArrayTypeE.Single)
655 {
657 }
658 else
659 {
661 }
662 }
663 else
664 {
666 }
667 }
668 return flag;
669 }
670
672 {
674 }
675
677 {
678 if (nameInfo == null)
679 {
681 }
682 else
683 {
684 nameInfo.Init();
685 }
686 if (code == InternalPrimitiveTypeE.Invalid && objectInfo != null)
687 {
688 nameInfo.NIname = objectInfo.GetTypeFullName();
689 nameInfo._assemId = objectInfo._assemId;
690 }
693 return nameInfo;
694 }
695
697 {
698 return TypeToNameInfo(type, null, ToCode(type), null);
699 }
700
702 {
703 return TypeToNameInfo(objectInfo._objectType, objectInfo, ToCode(objectInfo._objectType), null);
704 }
705
710
712 {
714 }
715
716 private NameInfo MemberToNameInfo(string name)
717 {
719 nameInfo.NIname = name;
720 return nameInfo;
721 }
722
737
739 {
740 if (_assemblyToIdTable == null)
741 {
743 }
744 long value = 0L;
745 string assemblyString = objectInfo.GetAssemblyString();
747 if (assemblyString.Length == 0)
748 {
749 value = 0L;
750 }
752 {
753 value = 0L;
754 }
755 else
756 {
757 bool isNew = false;
759 {
760 isNew = false;
761 }
762 else
763 {
764 value = InternalGetId("___AssemblyString___" + assemblyString, assignUniqueIdToValueType: false, null, out isNew);
766 }
768 }
769 return value;
770 }
771
772 private Type GetType(object obj)
773 {
774 return obj.GetType();
775 }
776
778 {
780 if (!_niPool.IsEmpty())
781 {
783 nameInfo.Init();
784 }
785 else
786 {
787 nameInfo = new NameInfo();
788 }
789 return nameInfo;
790 }
791
793 {
794 return (test & want) == want;
795 }
796
798 {
800 }
801}
bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue value)
void WriteMemberString(NameInfo memberNameInfo, NameInfo typeNameInfo, string value)
void WriteSerializationHeader(int topId, int headerId, int minorVersion, int majorVersion)
void WriteItem(NameInfo itemNameInfo, NameInfo typeNameInfo, object value)
void WriteObjectByteArray(NameInfo memberNameInfo, NameInfo arrayNameInfo, WriteObjectInfo objectInfo, NameInfo arrayElemTypeNameInfo, int length, int lowerBound, byte[] byteA)
void WriteSingleArray(NameInfo memberNameInfo, NameInfo arrayNameInfo, WriteObjectInfo objectInfo, NameInfo arrayElemTypeNameInfo, int length, int lowerBound, Array array)
void WriteNullItem(NameInfo itemNameInfo, NameInfo typeNameInfo)
void WriteRectangleArray(NameInfo memberNameInfo, NameInfo arrayNameInfo, WriteObjectInfo objectInfo, NameInfo arrayElemTypeNameInfo, int rank, int[] lengthA, int[] lowerBoundA)
void WriteMember(NameInfo memberNameInfo, NameInfo typeNameInfo, object value)
void WriteAssembly(Type type, string assemblyString, int assemId, bool isNew)
void WriteJaggedArray(NameInfo memberNameInfo, NameInfo arrayNameInfo, WriteObjectInfo objectInfo, NameInfo arrayElemTypeNameInfo, int length, int lowerBound)
void WriteObject(NameInfo nameInfo, NameInfo typeNameInfo, int numMembers, string[] memberNames, Type[] memberTypes, WriteObjectInfo[] memberObjectInfos)
void WriteNullMember(NameInfo memberNameInfo, NameInfo typeNameInfo)
void WriteObjectEnd(NameInfo memberNameInfo, NameInfo typeNameInfo)
static bool IsWriteAsByteArray(InternalPrimitiveTypeE code)
Definition Converter.cs:130
static InternalPrimitiveTypeE ToCode(Type type)
Definition Converter.cs:105
bool WriteKnownValueClass(NameInfo memberNameInfo, NameInfo typeNameInfo, object data)
void WriteArray(WriteObjectInfo objectInfo, NameInfo memberNameInfo, WriteObjectInfo memberObjectInfo)
void WriteMembers(NameInfo memberNameInfo, NameInfo memberTypeNameInfo, object memberData, WriteObjectInfo objectInfo, NameInfo typeNameInfo, WriteObjectInfo memberObjectInfo)
void WriteArrayMember(WriteObjectInfo objectInfo, NameInfo arrayElemTypeNameInfo, object data)
void WriteString(NameInfo memberNameInfo, NameInfo typeNameInfo, object stringObject)
ObjectWriter(ISurrogateSelector selector, StreamingContext context, InternalFE formatterEnums, SerializationBinder binder)
void Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo, string[] memberNames, Type[] memberTypes, object[] memberData, WriteObjectInfo[] memberObjectInfos)
NameInfo TypeToNameInfo(WriteObjectInfo objectInfo)
bool CheckForNull(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo, object data)
bool CheckTypeFormat(FormatterTypeStyle test, FormatterTypeStyle want)
long Schedule(object obj, bool assignUniqueIdToValueType, Type type)
long Schedule(object obj, bool assignUniqueIdToValueType, Type type, WriteObjectInfo objectInfo)
void WriteRectangle(WriteObjectInfo objectInfo, int rank, int[] maxA, Array array, NameInfo arrayElemNameTypeInfo, int[] lowerBoundA)
long InternalGetId(object obj, bool assignUniqueIdToValueType, Type type, out bool isNew)
void Serialize(object graph, BinaryFormatterWriter serWriter)
NameInfo TypeToNameInfo(WriteObjectInfo objectInfo, NameInfo nameInfo)
void WriteObjectRef(NameInfo nameInfo, long objectId)
NameInfo TypeToNameInfo(Type type, WriteObjectInfo objectInfo, InternalPrimitiveTypeE code, NameInfo nameInfo)
void Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
void WriteMemberSetup(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo, string memberName, Type memberType, object memberData, WriteObjectInfo memberObjectInfo)
static WriteObjectInfo Serialize(object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
virtual long GetId(object obj, out bool firstTime)
virtual long HasId(object obj, out bool firstTime)
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string Serialization_ObjNoID
Definition SR.cs:116
Definition SR.cs:7
static ? Type GetType(string typeName, bool throwOnError, bool ignoreCase)
Definition Type.cs:408
static ? Type GetUnderlyingType(Type nullableType)
Definition Nullable.cs:139