8 internal sealed
class __BinaryParser
10 internal ObjectReader objectReader;
16 internal long headerId;
18 internal SizedArray objectMapIdTable;
20 internal SizedArray assemIdToAssemblyTable;
22 internal SerStack stack =
new SerStack(
"ObjectProgressStack");
24 internal BinaryTypeEnum expectedType = BinaryTypeEnum.ObjectUrt;
26 internal object expectedTypeInformation;
28 internal ParseRecord PRS;
30 private BinaryAssemblyInfo systemAssemblyInfo;
34 private static Encoding encoding =
new UTF8Encoding(encoderShouldEmitUTF8Identifier:
false, throwOnInvalidBytes:
true);
36 private SerStack opPool;
38 private BinaryObject binaryObject;
40 private BinaryObjectWithMap bowm;
42 private BinaryObjectWithMapTyped bowmt;
44 internal BinaryObjectString objectString;
46 internal BinaryCrossAppDomainString crossAppDomainString;
48 internal MemberPrimitiveTyped memberPrimitiveTyped;
50 private byte[] byteBuffer;
52 private const int chunkSize = 4096;
54 internal MemberPrimitiveUnTyped memberPrimitiveUnTyped;
56 internal MemberReference memberReference;
58 internal ObjectNull objectNull;
60 internal static volatile MessageEnd messageEnd;
62 internal BinaryAssemblyInfo SystemAssemblyInfo
66 if (systemAssemblyInfo ==
null)
68 systemAssemblyInfo =
new BinaryAssemblyInfo(Converter.urtAssemblyString, Converter.urtAssembly);
70 return systemAssemblyInfo;
74 internal SizedArray ObjectMapIdTable
78 if (objectMapIdTable ==
null)
80 objectMapIdTable =
new SizedArray();
82 return objectMapIdTable;
86 internal SizedArray AssemIdToAssemblyTable
90 if (assemIdToAssemblyTable ==
null)
92 assemIdToAssemblyTable =
new SizedArray(2);
94 return assemIdToAssemblyTable;
98 internal ParseRecord prs
104 PRS =
new ParseRecord();
110 internal __BinaryParser(
Stream stream, ObjectReader objectReader)
113 this.objectReader = objectReader;
124 ReadSerializationHeaderRecord();
127 BinaryHeaderEnum binaryHeaderEnum = BinaryHeaderEnum.Object;
128 switch (expectedType)
130 case BinaryTypeEnum.String:
131 case BinaryTypeEnum.Object:
132 case BinaryTypeEnum.ObjectUrt:
133 case BinaryTypeEnum.ObjectUser:
134 case BinaryTypeEnum.ObjectArray:
135 case BinaryTypeEnum.StringArray:
136 case BinaryTypeEnum.PrimitiveArray:
139 binaryHeaderEnum = (BinaryHeaderEnum)b;
140 switch (binaryHeaderEnum)
142 case BinaryHeaderEnum.Assembly:
143 case BinaryHeaderEnum.CrossAppDomainAssembly:
144 ReadAssembly(binaryHeaderEnum);
146 case BinaryHeaderEnum.Object:
149 case BinaryHeaderEnum.CrossAppDomainMap:
150 ReadCrossAppDomainMap();
152 case BinaryHeaderEnum.ObjectWithMap:
153 case BinaryHeaderEnum.ObjectWithMapAssemId:
154 ReadObjectWithMap(binaryHeaderEnum);
156 case BinaryHeaderEnum.ObjectWithMapTyped:
157 case BinaryHeaderEnum.ObjectWithMapTypedAssemId:
158 ReadObjectWithMapTyped(binaryHeaderEnum);
160 case BinaryHeaderEnum.MethodCall:
161 case BinaryHeaderEnum.MethodReturn:
162 ReadMethodObject(binaryHeaderEnum);
164 case BinaryHeaderEnum.ObjectString:
165 case BinaryHeaderEnum.CrossAppDomainString:
166 ReadObjectString(binaryHeaderEnum);
168 case BinaryHeaderEnum.Array:
169 case BinaryHeaderEnum.ArraySinglePrimitive:
170 case BinaryHeaderEnum.ArraySingleObject:
171 case BinaryHeaderEnum.ArraySingleString:
172 ReadArray(binaryHeaderEnum);
174 case BinaryHeaderEnum.MemberPrimitiveTyped:
175 ReadMemberPrimitiveTyped();
177 case BinaryHeaderEnum.MemberReference:
178 ReadMemberReference();
180 case BinaryHeaderEnum.ObjectNull:
181 case BinaryHeaderEnum.ObjectNullMultiple256:
182 case BinaryHeaderEnum.ObjectNullMultiple:
183 ReadObjectNull(binaryHeaderEnum);
185 case BinaryHeaderEnum.MessageEnd:
195 case BinaryTypeEnum.Primitive:
196 ReadMemberPrimitiveUnTyped();
201 if (binaryHeaderEnum != BinaryHeaderEnum.Assembly)
206 ObjectProgress objectProgress = (ObjectProgress)stack.Peek();
207 if (objectProgress ==
null)
209 expectedType = BinaryTypeEnum.ObjectUrt;
210 expectedTypeInformation =
null;
215 flag2 = objectProgress.GetNext(out objectProgress.expectedType, out objectProgress.expectedTypeInformation);
216 expectedType = objectProgress.expectedType;
217 expectedTypeInformation = objectProgress.expectedTypeInformation;
221 if (objectProgress.memberValueEnum == InternalMemberValueE.Nested)
223 prs.PRparseTypeEnum = InternalParseTypeE.MemberEnd;
224 prs.PRmemberTypeEnum = objectProgress.memberTypeEnum;
225 prs.PRmemberValueEnum = objectProgress.memberValueEnum;
226 objectReader.Parse(prs);
230 prs.PRparseTypeEnum = InternalParseTypeE.ObjectEnd;
231 prs.PRmemberTypeEnum = objectProgress.memberTypeEnum;
232 prs.PRmemberValueEnum = objectProgress.memberValueEnum;
233 objectReader.Parse(prs);
236 PutOp(objectProgress);
249 internal void ReadBegin()
253 internal void ReadEnd()
257 internal bool ReadBoolean()
262 internal byte ReadByte()
267 internal byte[] ReadBytes(
int length)
272 internal void ReadBytes(
byte[] byteA,
int offset,
int size)
276 int num = dataReader.
Read(byteA, offset, size);
286 internal char ReadChar()
291 internal char[] ReadChars(
int length)
296 internal decimal ReadDecimal()
301 internal float ReadSingle()
306 internal double ReadDouble()
311 internal short ReadInt16()
316 internal int ReadInt32()
321 internal long ReadInt64()
326 internal sbyte ReadSByte()
328 return (sbyte)ReadByte();
331 internal string ReadString()
343 return DateTime.FromBinaryRaw(ReadInt64());
346 internal ushort ReadUInt16()
351 internal uint ReadUInt32()
356 internal ulong ReadUInt64()
362 internal void ReadSerializationHeaderRecord()
364 SerializationHeaderRecord serializationHeaderRecord =
new SerializationHeaderRecord();
365 serializationHeaderRecord.Read(
this);
366 serializationHeaderRecord.Dump();
367 topId = ((serializationHeaderRecord.topId > 0) ? objectReader.GetId(serializationHeaderRecord.topId) : serializationHeaderRecord.topId);
368 headerId = ((serializationHeaderRecord.headerId > 0) ? objectReader.GetId(serializationHeaderRecord.headerId) : serializationHeaderRecord.headerId);
372 internal void ReadAssembly(BinaryHeaderEnum binaryHeaderEnum)
374 BinaryAssembly binaryAssembly =
new BinaryAssembly();
375 if (binaryHeaderEnum == BinaryHeaderEnum.CrossAppDomainAssembly)
377 BinaryCrossAppDomainAssembly binaryCrossAppDomainAssembly =
new BinaryCrossAppDomainAssembly();
378 binaryCrossAppDomainAssembly.Read(
this);
379 binaryCrossAppDomainAssembly.Dump();
380 binaryAssembly.assemId = binaryCrossAppDomainAssembly.assemId;
381 binaryAssembly.assemblyString = (objectReader.CrossAppDomainArray(binaryCrossAppDomainAssembly.assemblyIndex) as string);
382 if (binaryAssembly.assemblyString ==
null)
389 binaryAssembly.Read(
this);
390 binaryAssembly.Dump();
392 AssemIdToAssemblyTable[binaryAssembly.assemId] =
new BinaryAssemblyInfo(binaryAssembly.assemblyString);
396 internal void ReadMethodObject(BinaryHeaderEnum binaryHeaderEnum)
398 if (binaryHeaderEnum == BinaryHeaderEnum.MethodCall)
400 BinaryMethodCall binaryMethodCall =
new BinaryMethodCall();
401 binaryMethodCall.Read(
this);
402 binaryMethodCall.Dump();
403 objectReader.SetMethodCall(binaryMethodCall);
407 BinaryMethodReturn binaryMethodReturn =
new BinaryMethodReturn();
408 binaryMethodReturn.Read(
this);
409 binaryMethodReturn.Dump();
410 objectReader.SetMethodReturn(binaryMethodReturn);
415 private void ReadObject()
417 if (binaryObject ==
null)
419 binaryObject =
new BinaryObject();
421 binaryObject.Read(
this);
423 ObjectMap objectMap = (ObjectMap)ObjectMapIdTable[binaryObject.mapId];
424 if (objectMap ==
null)
428 ObjectProgress op = GetOp();
429 ParseRecord pr = op.pr;
431 op.objectTypeEnum = InternalObjectTypeE.Object;
432 op.binaryTypeEnumA = objectMap.binaryTypeEnumA;
433 op.memberNames = objectMap.memberNames;
434 op.memberTypes = objectMap.memberTypes;
435 op.typeInformationA = objectMap.typeInformationA;
436 op.memberLength = op.binaryTypeEnumA.Length;
437 ObjectProgress objectProgress = (ObjectProgress)stack.PeekPeek();
438 if (objectProgress ==
null || objectProgress.isInitial)
440 op.name = objectMap.objectName;
441 pr.PRparseTypeEnum = InternalParseTypeE.Object;
442 op.memberValueEnum = InternalMemberValueE.Empty;
446 pr.PRparseTypeEnum = InternalParseTypeE.Member;
447 pr.PRmemberValueEnum = InternalMemberValueE.Nested;
448 op.memberValueEnum = InternalMemberValueE.Nested;
449 switch (objectProgress.objectTypeEnum)
451 case InternalObjectTypeE.Object:
452 pr.PRname = objectProgress.name;
453 pr.PRmemberTypeEnum = InternalMemberTypeE.Field;
454 op.memberTypeEnum = InternalMemberTypeE.Field;
456 case InternalObjectTypeE.Array:
457 pr.PRmemberTypeEnum = InternalMemberTypeE.Item;
458 op.memberTypeEnum = InternalMemberTypeE.Item;
464 pr.PRobjectId = objectReader.GetId(binaryObject.objectId);
465 pr.PRobjectInfo = objectMap.CreateObjectInfo(ref pr.PRsi, ref pr.PRmemberData);
466 if (pr.PRobjectId == topId)
468 pr.PRobjectPositionEnum = InternalObjectPositionE.Top;
470 pr.PRobjectTypeEnum = InternalObjectTypeE.Object;
471 pr.PRkeyDt = objectMap.objectName;
472 pr.PRdtType = objectMap.objectType;
473 pr.PRdtTypeCode = InternalPrimitiveTypeE.Invalid;
474 objectReader.Parse(pr);
478 internal void ReadCrossAppDomainMap()
480 BinaryCrossAppDomainMap binaryCrossAppDomainMap =
new BinaryCrossAppDomainMap();
481 binaryCrossAppDomainMap.Read(
this);
482 binaryCrossAppDomainMap.Dump();
483 object obj = objectReader.CrossAppDomainArray(binaryCrossAppDomainMap.crossAppDomainArrayIndex);
484 BinaryObjectWithMap binaryObjectWithMap = obj as BinaryObjectWithMap;
485 if (binaryObjectWithMap !=
null)
487 binaryObjectWithMap.Dump();
488 ReadObjectWithMap(binaryObjectWithMap);
491 BinaryObjectWithMapTyped binaryObjectWithMapTyped = obj as BinaryObjectWithMapTyped;
492 if (binaryObjectWithMapTyped !=
null)
494 ReadObjectWithMapTyped(binaryObjectWithMapTyped);
501 internal void ReadObjectWithMap(BinaryHeaderEnum binaryHeaderEnum)
505 bowm =
new BinaryObjectWithMap(binaryHeaderEnum);
509 bowm.binaryHeaderEnum = binaryHeaderEnum;
513 ReadObjectWithMap(bowm);
517 private void ReadObjectWithMap(BinaryObjectWithMap record)
519 BinaryAssemblyInfo binaryAssemblyInfo =
null;
520 ObjectProgress op = GetOp();
521 ParseRecord pr = op.pr;
523 if (record.binaryHeaderEnum == BinaryHeaderEnum.ObjectWithMapAssemId)
525 if (record.assemId < 1)
529 binaryAssemblyInfo = (BinaryAssemblyInfo)AssemIdToAssemblyTable[record.assemId];
530 if (binaryAssemblyInfo ==
null)
535 else if (record.binaryHeaderEnum == BinaryHeaderEnum.ObjectWithMap)
537 binaryAssemblyInfo = SystemAssemblyInfo;
539 Type type = objectReader.
GetType(binaryAssemblyInfo, record.name);
540 ObjectMap objectMap = ObjectMap.Create(record.name, type, record.memberNames, objectReader, record.objectId, binaryAssemblyInfo);
541 ObjectMapIdTable[record.objectId] = objectMap;
542 op.objectTypeEnum = InternalObjectTypeE.Object;
543 op.binaryTypeEnumA = objectMap.binaryTypeEnumA;
544 op.typeInformationA = objectMap.typeInformationA;
545 op.memberLength = op.binaryTypeEnumA.Length;
546 op.memberNames = objectMap.memberNames;
547 op.memberTypes = objectMap.memberTypes;
548 ObjectProgress objectProgress = (ObjectProgress)stack.PeekPeek();
549 if (objectProgress ==
null || objectProgress.isInitial)
551 op.name = record.name;
552 pr.PRparseTypeEnum = InternalParseTypeE.Object;
553 op.memberValueEnum = InternalMemberValueE.Empty;
557 pr.PRparseTypeEnum = InternalParseTypeE.Member;
558 pr.PRmemberValueEnum = InternalMemberValueE.Nested;
559 op.memberValueEnum = InternalMemberValueE.Nested;
560 switch (objectProgress.objectTypeEnum)
562 case InternalObjectTypeE.Object:
563 pr.PRname = objectProgress.name;
564 pr.PRmemberTypeEnum = InternalMemberTypeE.Field;
565 op.memberTypeEnum = InternalMemberTypeE.Field;
567 case InternalObjectTypeE.Array:
568 pr.PRmemberTypeEnum = InternalMemberTypeE.Item;
569 op.memberTypeEnum = InternalMemberTypeE.Field;
575 pr.PRobjectTypeEnum = InternalObjectTypeE.Object;
576 pr.PRobjectId = objectReader.GetId(record.objectId);
577 pr.PRobjectInfo = objectMap.CreateObjectInfo(ref pr.PRsi, ref pr.PRmemberData);
578 if (pr.PRobjectId == topId)
580 pr.PRobjectPositionEnum = InternalObjectPositionE.Top;
582 pr.PRkeyDt = record.name;
583 pr.PRdtType = objectMap.objectType;
584 pr.PRdtTypeCode = InternalPrimitiveTypeE.Invalid;
585 objectReader.Parse(pr);
589 internal void ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum)
593 bowmt =
new BinaryObjectWithMapTyped(binaryHeaderEnum);
597 bowmt.binaryHeaderEnum = binaryHeaderEnum;
600 ReadObjectWithMapTyped(bowmt);
604 private void ReadObjectWithMapTyped(BinaryObjectWithMapTyped record)
606 BinaryAssemblyInfo binaryAssemblyInfo =
null;
607 ObjectProgress op = GetOp();
608 ParseRecord pr = op.pr;
610 if (record.binaryHeaderEnum == BinaryHeaderEnum.ObjectWithMapTypedAssemId)
612 if (record.assemId < 1)
616 binaryAssemblyInfo = (BinaryAssemblyInfo)AssemIdToAssemblyTable[record.assemId];
617 if (binaryAssemblyInfo ==
null)
622 else if (record.binaryHeaderEnum == BinaryHeaderEnum.ObjectWithMapTyped)
624 binaryAssemblyInfo = SystemAssemblyInfo;
626 ObjectMap objectMap = ObjectMap.Create(record.name, record.memberNames, record.binaryTypeEnumA, record.typeInformationA, record.memberAssemIds, objectReader, record.objectId, binaryAssemblyInfo, AssemIdToAssemblyTable);
627 ObjectMapIdTable[record.objectId] = objectMap;
628 op.objectTypeEnum = InternalObjectTypeE.Object;
629 op.binaryTypeEnumA = objectMap.binaryTypeEnumA;
630 op.typeInformationA = objectMap.typeInformationA;
631 op.memberLength = op.binaryTypeEnumA.Length;
632 op.memberNames = objectMap.memberNames;
633 op.memberTypes = objectMap.memberTypes;
634 ObjectProgress objectProgress = (ObjectProgress)stack.PeekPeek();
635 if (objectProgress ==
null || objectProgress.isInitial)
637 op.name = record.name;
638 pr.PRparseTypeEnum = InternalParseTypeE.Object;
639 op.memberValueEnum = InternalMemberValueE.Empty;
643 pr.PRparseTypeEnum = InternalParseTypeE.Member;
644 pr.PRmemberValueEnum = InternalMemberValueE.Nested;
645 op.memberValueEnum = InternalMemberValueE.Nested;
646 switch (objectProgress.objectTypeEnum)
648 case InternalObjectTypeE.Object:
649 pr.PRname = objectProgress.name;
650 pr.PRmemberTypeEnum = InternalMemberTypeE.Field;
651 op.memberTypeEnum = InternalMemberTypeE.Field;
653 case InternalObjectTypeE.Array:
654 pr.PRmemberTypeEnum = InternalMemberTypeE.Item;
655 op.memberTypeEnum = InternalMemberTypeE.Item;
661 pr.PRobjectTypeEnum = InternalObjectTypeE.Object;
662 pr.PRobjectInfo = objectMap.CreateObjectInfo(ref pr.PRsi, ref pr.PRmemberData);
663 pr.PRobjectId = objectReader.GetId(record.objectId);
664 if (pr.PRobjectId == topId)
666 pr.PRobjectPositionEnum = InternalObjectPositionE.Top;
668 pr.PRkeyDt = record.name;
669 pr.PRdtType = objectMap.objectType;
670 pr.PRdtTypeCode = InternalPrimitiveTypeE.Invalid;
671 objectReader.Parse(pr);
675 private void ReadObjectString(BinaryHeaderEnum binaryHeaderEnum)
677 if (objectString ==
null)
679 objectString =
new BinaryObjectString();
681 if (binaryHeaderEnum == BinaryHeaderEnum.ObjectString)
683 objectString.Read(
this);
688 if (crossAppDomainString ==
null)
690 crossAppDomainString =
new BinaryCrossAppDomainString();
692 crossAppDomainString.Read(
this);
693 crossAppDomainString.Dump();
694 objectString.value = (objectReader.CrossAppDomainArray(crossAppDomainString.value) as string);
695 if (objectString.value ==
null)
699 objectString.objectId = crossAppDomainString.objectId;
702 prs.PRparseTypeEnum = InternalParseTypeE.Object;
703 prs.PRobjectId = objectReader.GetId(objectString.objectId);
704 if (prs.PRobjectId == topId)
706 prs.PRobjectPositionEnum = InternalObjectPositionE.Top;
708 prs.PRobjectTypeEnum = InternalObjectTypeE.Object;
709 ObjectProgress objectProgress = (ObjectProgress)stack.Peek();
710 prs.PRvalue = objectString.value;
711 prs.PRkeyDt =
"System.String";
712 prs.PRdtType = Converter.typeofString;
713 prs.PRdtTypeCode = InternalPrimitiveTypeE.Invalid;
714 prs.PRvarValue = objectString.value;
715 if (objectProgress ==
null)
717 prs.PRparseTypeEnum = InternalParseTypeE.Object;
718 prs.PRname =
"System.String";
722 prs.PRparseTypeEnum = InternalParseTypeE.Member;
723 prs.PRmemberValueEnum = InternalMemberValueE.InlineValue;
724 switch (objectProgress.objectTypeEnum)
726 case InternalObjectTypeE.Object:
727 prs.PRname = objectProgress.name;
728 prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
730 case InternalObjectTypeE.Array:
731 prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
737 objectReader.Parse(prs);
741 private void ReadMemberPrimitiveTyped()
743 if (memberPrimitiveTyped ==
null)
745 memberPrimitiveTyped =
new MemberPrimitiveTyped();
747 memberPrimitiveTyped.Read(
this);
748 memberPrimitiveTyped.Dump();
749 prs.PRobjectTypeEnum = InternalObjectTypeE.Object;
750 ObjectProgress objectProgress = (ObjectProgress)stack.Peek();
752 prs.PRvarValue = memberPrimitiveTyped.value;
753 prs.PRkeyDt = Converter.ToComType(memberPrimitiveTyped.primitiveTypeEnum);
754 prs.PRdtType = Converter.ToType(memberPrimitiveTyped.primitiveTypeEnum);
755 prs.PRdtTypeCode = memberPrimitiveTyped.primitiveTypeEnum;
756 if (objectProgress ==
null)
758 prs.PRparseTypeEnum = InternalParseTypeE.Object;
759 prs.PRname =
"System.Variant";
763 prs.PRparseTypeEnum = InternalParseTypeE.Member;
764 prs.PRmemberValueEnum = InternalMemberValueE.InlineValue;
765 switch (objectProgress.objectTypeEnum)
767 case InternalObjectTypeE.Object:
768 prs.PRname = objectProgress.name;
769 prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
771 case InternalObjectTypeE.Array:
772 prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
778 objectReader.Parse(prs);
782 private void ReadArray(BinaryHeaderEnum binaryHeaderEnum)
784 BinaryAssemblyInfo binaryAssemblyInfo =
null;
785 BinaryArray binaryArray =
new BinaryArray(binaryHeaderEnum);
786 binaryArray.Read(
this);
787 if (binaryArray.binaryTypeEnum == BinaryTypeEnum.ObjectUser)
789 if (binaryArray.assemId < 1)
793 binaryAssemblyInfo = (BinaryAssemblyInfo)AssemIdToAssemblyTable[binaryArray.assemId];
797 binaryAssemblyInfo = SystemAssemblyInfo;
799 ObjectProgress op = GetOp();
800 ParseRecord pr = op.pr;
801 op.objectTypeEnum = InternalObjectTypeE.Array;
802 op.binaryTypeEnum = binaryArray.binaryTypeEnum;
803 op.typeInformation = binaryArray.typeInformation;
804 ObjectProgress objectProgress = (ObjectProgress)stack.PeekPeek();
805 if (objectProgress ==
null || binaryArray.objectId > 0)
807 op.name =
"System.Array";
808 pr.PRparseTypeEnum = InternalParseTypeE.Object;
809 op.memberValueEnum = InternalMemberValueE.Empty;
813 pr.PRparseTypeEnum = InternalParseTypeE.Member;
814 pr.PRmemberValueEnum = InternalMemberValueE.Nested;
815 op.memberValueEnum = InternalMemberValueE.Nested;
816 switch (objectProgress.objectTypeEnum)
818 case InternalObjectTypeE.Object:
819 pr.PRname = objectProgress.name;
820 pr.PRmemberTypeEnum = InternalMemberTypeE.Field;
821 op.memberTypeEnum = InternalMemberTypeE.Field;
822 pr.PRkeyDt = objectProgress.name;
823 pr.PRdtType = objectProgress.dtType;
825 case InternalObjectTypeE.Array:
826 pr.PRmemberTypeEnum = InternalMemberTypeE.Item;
827 op.memberTypeEnum = InternalMemberTypeE.Item;
833 pr.PRobjectId = objectReader.GetId(binaryArray.objectId);
834 if (pr.PRobjectId == topId)
836 pr.PRobjectPositionEnum = InternalObjectPositionE.Top;
838 else if (headerId > 0 && pr.PRobjectId == headerId)
840 pr.PRobjectPositionEnum = InternalObjectPositionE.Headers;
844 pr.PRobjectPositionEnum = InternalObjectPositionE.Child;
846 pr.PRobjectTypeEnum = InternalObjectTypeE.Array;
847 BinaryConverter.TypeFromInfo(binaryArray.binaryTypeEnum, binaryArray.typeInformation, objectReader, binaryAssemblyInfo, out pr.PRarrayElementTypeCode, out pr.PRarrayElementTypeString, out pr.PRarrayElementType, out pr.PRisArrayVariant);
848 pr.PRdtTypeCode = InternalPrimitiveTypeE.Invalid;
849 pr.PRrank = binaryArray.rank;
850 pr.PRlengthA = binaryArray.lengthA;
851 pr.PRlowerBoundA = binaryArray.lowerBoundA;
853 switch (binaryArray.binaryArrayTypeEnum)
855 case BinaryArrayTypeEnum.Single:
856 case BinaryArrayTypeEnum.SingleOffset:
857 op.numItems = binaryArray.lengthA[0];
858 pr.PRarrayTypeEnum = InternalArrayTypeE.Single;
859 if (Converter.IsWriteAsByteArray(pr.PRarrayElementTypeCode) && binaryArray.lowerBoundA[0] == 0)
862 ReadArrayAsBytes(pr);
865 case BinaryArrayTypeEnum.Jagged:
866 case BinaryArrayTypeEnum.JaggedOffset:
867 op.numItems = binaryArray.lengthA[0];
868 pr.PRarrayTypeEnum = InternalArrayTypeE.Jagged;
870 case BinaryArrayTypeEnum.Rectangular:
871 case BinaryArrayTypeEnum.RectangularOffset:
874 for (
int i = 0; i < binaryArray.rank; i++)
876 num *= binaryArray.lengthA[i];
879 pr.PRarrayTypeEnum = InternalArrayTypeE.Rectangular;
893 objectReader.Parse(pr);
896 pr.PRparseTypeEnum = InternalParseTypeE.ObjectEnd;
897 objectReader.Parse(pr);
902 private void ReadArrayAsBytes(ParseRecord pr)
904 if (pr.PRarrayElementTypeCode == InternalPrimitiveTypeE.Byte)
906 pr.PRnewObj = ReadBytes(pr.PRlengthA[0]);
909 if (pr.PRarrayElementTypeCode == InternalPrimitiveTypeE.Char)
911 pr.PRnewObj = ReadChars(pr.PRlengthA[0]);
914 int num = Converter.TypeLength(pr.PRarrayElementTypeCode);
915 pr.PRnewObj = Converter.CreatePrimitiveArray(pr.PRarrayElementTypeCode, pr.PRlengthA[0]);
918 if (byteBuffer ==
null)
920 byteBuffer =
new byte[4096];
923 for (; i < array.Length; i += num2)
925 num2 =
Math.
Min(4096 / num, array.Length - i);
926 int num3 = num2 * num;
927 ReadBytes(byteBuffer, 0, num3);
928 Buffer.InternalBlockCopy(byteBuffer, 0, array, i * num, num3);
933 private void ReadMemberPrimitiveUnTyped()
935 ObjectProgress objectProgress = (ObjectProgress)stack.Peek();
936 if (memberPrimitiveUnTyped ==
null)
938 memberPrimitiveUnTyped =
new MemberPrimitiveUnTyped();
940 memberPrimitiveUnTyped.Set((InternalPrimitiveTypeE)expectedTypeInformation);
941 memberPrimitiveUnTyped.Read(
this);
942 memberPrimitiveUnTyped.Dump();
944 prs.PRvarValue = memberPrimitiveUnTyped.value;
945 prs.PRdtTypeCode = (InternalPrimitiveTypeE)expectedTypeInformation;
946 prs.PRdtType = Converter.ToType(prs.PRdtTypeCode);
947 prs.PRparseTypeEnum = InternalParseTypeE.Member;
948 prs.PRmemberValueEnum = InternalMemberValueE.InlineValue;
949 if (objectProgress.objectTypeEnum == InternalObjectTypeE.Object)
951 prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
952 prs.PRname = objectProgress.name;
956 prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
958 objectReader.Parse(prs);
962 private void ReadMemberReference()
964 if (memberReference ==
null)
966 memberReference =
new MemberReference();
968 memberReference.Read(
this);
969 memberReference.Dump();
970 ObjectProgress objectProgress = (ObjectProgress)stack.Peek();
972 prs.PRidRef = objectReader.GetId(memberReference.idRef);
973 prs.PRparseTypeEnum = InternalParseTypeE.Member;
974 prs.PRmemberValueEnum = InternalMemberValueE.Reference;
975 if (objectProgress.objectTypeEnum == InternalObjectTypeE.Object)
977 prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
978 prs.PRname = objectProgress.name;
979 prs.PRdtType = objectProgress.dtType;
983 prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
985 objectReader.Parse(prs);
989 private void ReadObjectNull(BinaryHeaderEnum binaryHeaderEnum)
991 if (objectNull ==
null)
993 objectNull =
new ObjectNull();
995 objectNull.Read(
this, binaryHeaderEnum);
997 ObjectProgress objectProgress = (ObjectProgress)stack.Peek();
999 prs.PRparseTypeEnum = InternalParseTypeE.Member;
1000 prs.PRmemberValueEnum = InternalMemberValueE.Null;
1001 if (objectProgress.objectTypeEnum == InternalObjectTypeE.Object)
1003 prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
1004 prs.PRname = objectProgress.name;
1005 prs.PRdtType = objectProgress.dtType;
1009 prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
1010 prs.PRnullCount = objectNull.nullCount;
1011 objectProgress.ArrayCountIncrement(objectNull.nullCount - 1);
1013 objectReader.Parse(prs);
1017 private void ReadMessageEnd()
1019 if (messageEnd ==
null)
1021 messageEnd =
new MessageEnd();
1023 messageEnd.Read(
this);
1025 if (!stack.IsEmpty())
1031 internal object ReadValue(InternalPrimitiveTypeE code)
1036 case InternalPrimitiveTypeE.Boolean:
1037 return ReadBoolean();
1038 case InternalPrimitiveTypeE.Byte:
1040 case InternalPrimitiveTypeE.Char:
1042 case InternalPrimitiveTypeE.Double:
1043 return ReadDouble();
1044 case InternalPrimitiveTypeE.Int16:
1046 case InternalPrimitiveTypeE.Int32:
1048 case InternalPrimitiveTypeE.Int64:
1050 case InternalPrimitiveTypeE.SByte:
1052 case InternalPrimitiveTypeE.Single:
1053 return ReadSingle();
1054 case InternalPrimitiveTypeE.UInt16:
1055 return ReadUInt16();
1056 case InternalPrimitiveTypeE.UInt32:
1057 return ReadUInt32();
1058 case InternalPrimitiveTypeE.UInt64:
1059 return ReadUInt64();
1060 case InternalPrimitiveTypeE.Decimal:
1061 return ReadDecimal();
1062 case InternalPrimitiveTypeE.TimeSpan:
1063 return ReadTimeSpan();
1064 case InternalPrimitiveTypeE.DateTime:
1065 return ReadDateTime();
1071 private ObjectProgress GetOp()
1073 ObjectProgress objectProgress =
null;
1074 if (opPool !=
null && !opPool.IsEmpty())
1076 objectProgress = (ObjectProgress)opPool.Pop();
1077 objectProgress.Init();
1081 objectProgress =
new ObjectProgress();
1083 return objectProgress;
1086 private void PutOp(ObjectProgress op)
1090 opPool =
new SerStack(
"opPool");
Represents a character encoding.To browse the .NET Framework source code for this type,...
static CultureInfo InvariantCulture
Gets the T:System.Globalization.CultureInfo object that is culture-independent (invariant).
The exception that is thrown when reading is attempted past the end of a stream.
virtual char [] ReadChars(int count)
Reads the specified number of characters from the current stream, returns the data in a character arr...
virtual int ReadInt32()
Reads a 4-byte signed integer from the current stream and advances the current position of the stream...
virtual ulong ReadUInt64()
Reads an 8-byte unsigned integer from the current stream and advances the position of the stream by e...
static sbyte Min(sbyte val1, sbyte val2)
Returns the smaller of two 8-bit signed integers.
Represents an instant in time, typically expressed as a date and time of day. To browse the ....
virtual byte ReadByte()
Reads the next byte from the current stream and advances the current position of the stream by one by...
virtual ushort ReadUInt16()
Reads a 2-byte unsigned integer from the current stream using little-endian encoding and advances the...
virtual short ReadInt16()
Reads a 2-byte signed integer from the current stream and advances the current position of the stream...
virtual uint ReadUInt32()
Reads a 4-byte unsigned integer from the current stream and advances the position of the stream by fo...
Provides information about, and means to manipulate, the current environment and platform....
virtual byte [] ReadBytes(int count)
Reads the specified number of bytes from the current stream into a byte array and advances the curren...
virtual bool ReadBoolean()
Reads a Boolean value from the current stream and advances the current position of the stream by one ...
Reads primitive data types as binary values in a specific encoding.
Represents a UTF-8 encoding of Unicode characters.
Provides methods for creating, manipulating, searching, and sorting arrays, thereby serving as the ba...
Represents type declarations: class types, interface types, array types, value types,...
The exception thrown when an error occurs during serialization or deserialization.
virtual int Read()
Reads characters from the underlying stream and advances the current position of the stream in accord...
virtual char ReadChar()
Reads the next character from the current stream and advances the current position of the stream in a...
virtual unsafe float ReadSingle()
Reads a 4-byte floating point value from the current stream and advances the current position of the ...
Represents a time interval.To browse the .NET Framework source code for this type,...
virtual unsafe double ReadDouble()
Reads an 8-byte floating point value from the current stream and advances the current position of the...
Manipulates arrays of primitive types.
static Type GetType(string typeName, bool throwOnError, bool ignoreCase)
Gets the T:System.Type with the specified name, specifying whether to throw an exception if the type ...
virtual string ReadString()
Reads a string from the current stream. The string is prefixed with the length, encoded as an integer...
Provides constants and static methods for trigonometric, logarithmic, and other common mathematical f...
Provides information about a specific culture (called a locale for unmanaged code development)....
virtual long ReadInt64()
Reads an 8-byte signed integer from the current stream and advances the current position of the strea...
Provides a generic view of a sequence of bytes. This is an abstract class.To browse the ....