static public object GetBinaryTypeValue(IAnalyze analyze, BinaryTypeEnumeration binaryType) { object value = null; switch (binaryType) { case BinaryTypeEnumeration.Primitive: var temp = (PrimitiveTypeEnumeration)analyze.Reader.ReadByte(); value = temp; if (temp == PrimitiveTypeEnumeration.String) { throw new Exception(); } break; case BinaryTypeEnumeration.SystemClass: //可能有问题 value = new LengthPrefixedString(analyze); break; case BinaryTypeEnumeration.Class: value = new ClassTypeInfo(analyze); break; case BinaryTypeEnumeration.PrimitiveArray: value = (PrimitiveTypeEnumeration)analyze.Reader.ReadByte(); break; } return(value); }
/// <summary> /// 检查是否符合 BinaryTypeEnumeration 的值 /// </summary> /// <param name="value"></param> static public void IsBinaryTypeEnum(BinaryTypeEnumeration value) { if (value < BinaryTypeEnumeration.Primitive || value > BinaryTypeEnumeration.PrimitiveArray) { throw new RollBackException(); } }
public MemberTypeInfo(IAnalyze analyze, int memberCount) : base(analyze) { BinaryTypeEnums = new BinaryTypeEnumeration[memberCount]; AdditionalInfos = new object[memberCount]; for (int i = 0; i < memberCount; i++) { var type = (BinaryTypeEnumeration)analyze.Reader.ReadByte(); Assert.IsBinaryTypeEnum(type); BinaryTypeEnums[i] = type; } for (int i = 0; i < memberCount; i++) { object value = Common.GetBinaryTypeValue(analyze, BinaryTypeEnums[i]); AdditionalInfos[i] = value; } }
internal BinaryArray(BinaryTypeEnumeration type) { BinaryType = type; Rank = 1; }
public MemberTypeInfo(IParsingContext context, Int32 count) { BinaryTypeEnums = new BinaryTypeEnumeration[count]; AdditionalInfos = new Object[count]; for (var i = 0; i < count; ++i) { BinaryTypeEnums[i] = (BinaryTypeEnumeration)context.ReadByte(); } for (var i = 0; i < count; ++i) { var binaryType = BinaryTypeEnums[i]; switch (binaryType) { case BinaryTypeEnumeration.String: case BinaryTypeEnumeration.StringArray: case BinaryTypeEnumeration.Object: case BinaryTypeEnumeration.ObjectArray: break; case BinaryTypeEnumeration.Primitive: case BinaryTypeEnumeration.PrimitiveArray: AdditionalInfos[i] = (PrimitiveTypeEnumeration)context.ReadByte(); break; case BinaryTypeEnumeration.SystemClass: AdditionalInfos[i] = context.ReadString(); break; case BinaryTypeEnumeration.Class: AdditionalInfos[i] = new ClassTypeInfo(context); break; default: throw new NotSupportedException("Unsupported BinaryType " + binaryType); } } }