private void ReadObjectNull(BinaryHeaderEnum binaryHeaderEnum) { SerTrace.Log(this, "ReadObjectNull "); if (objectNull == null) { objectNull = new ObjectNull(); } objectNull.Read(this, binaryHeaderEnum); objectNull.Dump(); ObjectProgress objectOp = (ObjectProgress)stack.Peek(); prs.Init(); prs.PRparseTypeEnum = InternalParseTypeE.Member; prs.PRmemberValueEnum = InternalMemberValueE.Null; if (objectOp.objectTypeEnum == InternalObjectTypeE.Object) { prs.PRmemberTypeEnum = InternalMemberTypeE.Field; prs.PRname = objectOp.name; prs.PRdtType = objectOp.dtType; } else { prs.PRmemberTypeEnum = InternalMemberTypeE.Item; prs.PRnullCount = objectNull.nullCount; //only one null position has been incremented by GetNext //The position needs to be reset for the rest of the nulls objectOp.ArrayCountIncrement(objectNull.nullCount - 1); } objectReader.Parse(prs); }
[System.Security.SecurityCritical] // auto-generated internal Object Deserialize(Stream serializationStream, HeaderHandler handler, bool fCheck, bool isCrossAppDomain, IMethodCallMessage methodCallMessage) { if (serializationStream == null) { throw new ArgumentNullException("serializationStream", Environment.GetResourceString("ArgumentNull_WithParamName", serializationStream)); } Contract.EndContractBlock(); if (serializationStream.CanSeek && (serializationStream.Length == 0)) { throw new SerializationException(Environment.GetResourceString("Serialization_Stream")); } SerTrace.Log(this, "Deserialize Entry"); InternalFE formatterEnums = new InternalFE(); formatterEnums.FEtypeFormat = m_typeFormat; formatterEnums.FEserializerTypeEnum = InternalSerializerTypeE.Binary; formatterEnums.FEassemblyFormat = m_assemblyFormat; formatterEnums.FEsecurityLevel = m_securityLevel; ObjectReader sor = new ObjectReader(serializationStream, m_surrogates, m_context, formatterEnums, m_binder); sor.crossAppDomainArray = m_crossAppDomainArray; return(sor.Deserialize(handler, new __BinaryParser(serializationStream, sor), fCheck, isCrossAppDomain, methodCallMessage)); }
private void ReadMemberPrimitiveUnTyped() { SerTrace.Log(this, "ReadMemberPrimitiveUnTyped "); ObjectProgress objectOp = (ObjectProgress)stack.Peek(); if (memberPrimitiveUnTyped == null) { memberPrimitiveUnTyped = new MemberPrimitiveUnTyped(); } memberPrimitiveUnTyped.Set((InternalPrimitiveTypeE)expectedTypeInformation); memberPrimitiveUnTyped.Read(this); memberPrimitiveUnTyped.Dump(); prs.Init(); prs.PRvarValue = memberPrimitiveUnTyped.value; prs.PRdtTypeCode = (InternalPrimitiveTypeE)expectedTypeInformation; prs.PRdtType = Converter.ToType(prs.PRdtTypeCode); prs.PRparseTypeEnum = InternalParseTypeE.Member; prs.PRmemberValueEnum = InternalMemberValueE.InlineValue; if (objectOp.objectTypeEnum == InternalObjectTypeE.Object) { prs.PRmemberTypeEnum = InternalMemberTypeE.Field; prs.PRname = objectOp.name; } else { prs.PRmemberTypeEnum = InternalMemberTypeE.Item; } objectReader.Parse(prs); }
internal void ReadCrossAppDomainMap() { SerTrace.Log(this, "ReadObjectWithCrossAppDomainMap"); BinaryCrossAppDomainMap record = new BinaryCrossAppDomainMap(); record.Read(this); record.Dump(); Object mapObject = objectReader.CrossAppDomainArray(record.crossAppDomainArrayIndex); BinaryObjectWithMap binaryObjectWithMap = mapObject as BinaryObjectWithMap; if (binaryObjectWithMap != null) { binaryObjectWithMap.Dump(); ReadObjectWithMap(binaryObjectWithMap); } else { BinaryObjectWithMapTyped binaryObjectWithMapTyped = mapObject as BinaryObjectWithMapTyped; if (binaryObjectWithMapTyped != null) { binaryObjectWithMapTyped.Dump(); ReadObjectWithMapTyped(binaryObjectWithMapTyped); } else { throw new SerializationException(String.Format(Environment.GetResourceString("Serialization_CrossAppDomainError"), "BinaryObjectMap", mapObject)); } } }
internal void WriteAssembly(String typeFullName, Type type, String assemblyString, int assemId, bool isNew, bool isInteropType) { SerTrace.Log(this, "WriteAssembly type ", type, ", id ", assemId, ", name ", assemblyString, ", isNew ", isNew); //If the file being tested wasn't built as an assembly, then we're going to get null back //for the assembly name. This is very unfortunate. InternalWriteItemNull(); if (assemblyString == null) { assemblyString = String.Empty; } if (isNew) { if (objectWriter.IsCrossAppDomain()) { if (crossAppDomainAssembly == null) { crossAppDomainAssembly = new BinaryCrossAppDomainAssembly(); } crossAppDomainAssembly.Set(assemId, objectWriter.CrossAppDomainArrayAdd(assemblyString)); crossAppDomainAssembly.Dump(); crossAppDomainAssembly.Write(this); } else { if (binaryAssembly == null) { binaryAssembly = new BinaryAssembly(); } binaryAssembly.Set(assemId, assemblyString); binaryAssembly.Dump(); binaryAssembly.Write(this); } } }
private void InitMemberInfo() { SerTrace.Log(this, objectInfoId, " ", objectType, " InitMemberInfo Entry"); SerTrace.Log(this, objectInfoId, " ", objectType, " InitMemberInfo new cache"); cache = new SerObjectInfoCache(); cache.memberInfos = FormatterServices.GetSerializableMembers(objectType, context); count = cache.memberInfos.Length; cache.memberNames = new String[count]; cache.memberTypes = new Type[count]; // Calculate new arrays for (int i = 0; i < count; i++) { cache.memberNames[i] = cache.memberInfos[i].Name; cache.memberTypes[i] = GetMemberType(cache.memberInfos[i]); SerTrace.Log(this, objectInfoId, " InitMemberInfo name ", cache.memberNames[i], ", type ", cache.memberTypes[i], ", memberInfoType ", cache.memberInfos[i].GetType()); } cache.fullTypeName = objectType.FullName; cache.assemblyString = objectType.Module.Assembly.FullName; isTyped = true; isNamed = true; SerTrace.Log(this, objectInfoId, " ", objectType, " InitMemberInfo Exit"); }
private static int primitiveTypeEnumLength = 17; //Number of PrimitiveTypeEnums // The following section are utilities to read and write XML types internal static InternalPrimitiveTypeE ToCode(Type type) { SerTrace.Log("Converter", "ToCode Type Entry ", type); InternalPrimitiveTypeE code; if ((object)type != null && !type.IsPrimitive) { if (Object.ReferenceEquals(type, typeofDateTime)) { code = InternalPrimitiveTypeE.DateTime; } else if (Object.ReferenceEquals(type, typeofTimeSpan)) { code = InternalPrimitiveTypeE.TimeSpan; } else if (Object.ReferenceEquals(type, typeofDecimal)) { code = InternalPrimitiveTypeE.Decimal; } else { code = InternalPrimitiveTypeE.Invalid; } } else { code = ToPrimitiveTypeEnum(Type.GetTypeCode(type)); } SerTrace.Log("Converter", "ToCode Exit ", ((Enum)code).ToString()); return(code); }
private void ReadMemberReference() { SerTrace.Log(this, "ReadMemberReference "); if (memberReference == null) { memberReference = new MemberReference(); } memberReference.Read(this); memberReference.Dump(); ObjectProgress objectOp = (ObjectProgress)stack.Peek(); prs.Init(); prs.PRidRef = objectReader.GetId((long)memberReference.idRef); prs.PRparseTypeEnum = InternalParseTypeE.Member; prs.PRmemberValueEnum = InternalMemberValueE.Reference; if (objectOp.objectTypeEnum == InternalObjectTypeE.Object) { prs.PRmemberTypeEnum = InternalMemberTypeE.Field; prs.PRname = objectOp.name; prs.PRdtType = objectOp.dtType; } else { prs.PRmemberTypeEnum = InternalMemberTypeE.Item; } objectReader.Parse(prs); }
private void InitNoMembers() { SerTrace.Log(this, objectInfoId, " ", objectType, " InitMemberInfo new cache"); cache = new SerObjectInfoCache(); cache.fullTypeName = objectType.FullName; cache.assemblyString = objectType.Module.Assembly.FullName; }
// Get the ObjectType for a memberName internal Type GetType(String name) { SerTrace.Log(this, objectInfoId, " ", objectType, " GetType Entry ", name); Type type = null; int position = Position(name); if (position == -1) { return(null); } if (isTyped) { type = cache.memberTypes[position]; } else { type = (Type)memberTypesList[position]; } if (type == null) { throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Serialization_ISerializableTypes"), objectType + " " + name)); } SerTrace.Log(this, objectInfoId, " ", objectType, " GetType Exit ", type); return(type); }
private void DumpMemberInfo() { for (int i = 0; i < cache.memberInfos.Length; i++) { SerTrace.Log(this, objectInfoId, " Constructor 1 memberInfos data ", cache.memberInfos[i].Name, " ", memberData[i]); } }
// Read Constructor internal void Init(Type objectType, String[] memberNames, Type[] memberTypes, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, bool bSimpleAssembly) { SerTrace.Log(this, objectInfoId, " Constructor 5 ", objectType); this.objectType = objectType; this.objectManager = objectManager; this.wireMemberNames = memberNames; this.wireMemberTypes = memberTypes; this.context = context; this.serObjectInfoInit = serObjectInfoInit; this.formatterConverter = converter; this.bSimpleAssembly = bSimpleAssembly; if (memberNames != null) { isNamed = true; } if (memberTypes != null) { isTyped = true; } if (objectType != null) { InitReadConstructor(objectType, surrogateSelector, context); } }
// Get the memberInfo for a memberName internal MemberInfo GetMemberInfo(String name) { SerTrace.Log(this, objectInfoId, " ", objectType, " GetMemberInfo Entry ", name); if (cache == null) { return(null); } if (isSi) { throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Serialization_MemberInfo"), objectType + " " + name)); } if (cache.memberInfos == null) { throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Serialization_NoMemberInfo"), objectType + " " + name)); } int position = Position(name); if (position != -1) { return(cache.memberInfos[Position(name)]); } else { return(null); } }
private void DumpPopulate(MemberInfo[] memberInfos, Object[] memberData) { for (int i = 0; i < memberInfos.Length; i++) { SerTrace.Log(this, objectInfoId, " ", objectType, " PopulateObjectMembers ", memberInfos[i].Name, " ", memberData[i]); } }
internal void ReadAssembly(BinaryHeaderEnum binaryHeaderEnum) { SerTrace.Log(this, "ReadAssembly"); BinaryAssembly record = new BinaryAssembly(); if (binaryHeaderEnum == BinaryHeaderEnum.CrossAppDomainAssembly) { BinaryCrossAppDomainAssembly crossAppDomainAssembly = new BinaryCrossAppDomainAssembly(); crossAppDomainAssembly.Read(this); crossAppDomainAssembly.Dump(); record.assemId = crossAppDomainAssembly.assemId; record.assemblyString = objectReader.CrossAppDomainArray(crossAppDomainAssembly.assemblyIndex) as String; if (record.assemblyString == null) { throw new SerializationException(String.Format(Environment.GetResourceString("Serialization_CrossAppDomainError"), "String", crossAppDomainAssembly.assemblyIndex)); } } else { record.Read(this); record.Dump(); } AssemIdToAssemblyTable[record.assemId] = new BinaryAssemblyInfo(record.assemblyString); }
// Specifies the position in the memberNames array of this name private int Position(String name) { SerTrace.Log(this, objectInfoId, " Position ", lastPosition, " ", name); if (cache.memberNames[lastPosition].Equals(name)) { return(lastPosition); } else if ((++lastPosition < cache.memberNames.Length) && (cache.memberNames[lastPosition].Equals(name))) { return(lastPosition); } else { // Search for name SerTrace.Log(this, objectInfoId, " Position miss search for name " + name); for (int i = 0; i < cache.memberNames.Length; i++) { if (cache.memberNames[i].Equals(name)) { lastPosition = i; return(lastPosition); } } throw new SerializationException(String.Format(Environment.GetResourceString("Serialization_Position"), objectType + " " + name)); } }
internal ValueFixup(Array arrayObj, int[] indexMap) { SerTrace.Log(this, "Array Constructor ", arrayObj); valueFixupEnum = ValueFixupEnum.Array; this.arrayObj = arrayObj; this.indexMap = indexMap; }
internal ValueFixup(Object memberObject, String memberName, ReadObjectInfo objectInfo) { SerTrace.Log(this, "Member Constructor ", memberObject); valueFixupEnum = ValueFixupEnum.Member; this.memberObject = memberObject; this.memberName = memberName; this.objectInfo = objectInfo; }
internal void Dump() { for (int i = 0; i < Count(); i++) { Object obj = objects[i]; SerTrace.Log(this, "Stack Dump ", stackId, " " + ((obj is ITrace)?((ITrace)obj).Trace():"")); } }
private void InitSiWrite() { SerTrace.Log(this, objectInfoId, " InitSiWrite Entry "); SerializationInfoEnumerator siEnum = null; isSi = true; siEnum = si.GetEnumerator(); int infoLength = 0; infoLength = si.MemberCount; int count = infoLength; // For ISerializable cache cannot be saved because each object instance can have different values // BinaryWriter only puts the map on the wire if the ISerializable map cannot be reused. TypeInformation typeInformation = null; string fullTypeName = si.FullTypeName; string assemblyString = si.AssemblyName; bool hasTypeForwardedFrom = false; if (!si.IsFullTypeNameSetExplicit) { typeInformation = BinaryFormatter.GetTypeInformation(si.ObjectType); fullTypeName = typeInformation.FullTypeName; hasTypeForwardedFrom = typeInformation.HasTypeForwardedFrom; } if (!si.IsAssemblyNameSetExplicit) { if (typeInformation == null) { typeInformation = BinaryFormatter.GetTypeInformation(si.ObjectType); } assemblyString = typeInformation.AssemblyString; hasTypeForwardedFrom = typeInformation.HasTypeForwardedFrom; } cache = new SerObjectInfoCache(fullTypeName, assemblyString, hasTypeForwardedFrom); cache.memberNames = new String[count]; cache.memberTypes = new Type[count]; memberData = new Object[count]; siEnum = si.GetEnumerator(); for (int i = 0; siEnum.MoveNext(); i++) { cache.memberNames[i] = siEnum.Name; cache.memberTypes[i] = siEnum.ObjectType; memberData[i] = siEnum.Value; SerTrace.Log(this, objectInfoId + " ", objectType, " InitSiWrite ", cache.memberNames[i], " Type ", cache.memberTypes[i], " data ", memberData[i]); } isNamed = true; isTyped = false; SerTrace.Log(this, objectInfoId, " InitSiWrite Exit "); }
private int nullCount = 0; //Count of consecutive array nulls // Constructor internal __BinaryWriter(Stream sout, ObjectWriter objectWriter, FormatterTypeStyle formatterTypeStyle) { SerTrace.Log(this, "BinaryWriter "); this.sout = sout; this.formatterTypeStyle = formatterTypeStyle; this.objectWriter = objectWriter; m_nestedObjectCount = 0; dataWriter = new BinaryWriter(sout, Encoding.UTF8); }
// Gets the second entry in the stack. internal Object PeekPeek() { if (top < 1) { return(null); } SerTrace.Log(this, "PeekPeek ", stackId, " ", ((objects[top - 1] is ITrace)?((ITrace)objects[top - 1]).Trace():"")); return(objects[top - 1]); }
// Push the object onto the stack internal void Push(Object obj) { SerTrace.Log(this, "Push ", stackId, " ", ((obj is ITrace)?((ITrace)obj).Trace():"")); if (top == (objects.Length - 1)) { IncreaseCapacity(); } objects[++top] = obj; }
// Return the member Types in order of memberNames internal Type[] GetMemberTypes(String[] inMemberNames) { if (isSi) { throw new SerializationException(String.Format(Environment.GetResourceString("Serialization_ISerializableTypes"), objectType)); } BCLDebug.Assert(cache != null, "[ReadObjectInfo::GetMemberTypes] cache!=null"); if (cache.memberTypes == null) { cache.memberTypes = new Type[count]; for (int i = 0; i < count; i++) { cache.memberTypes[i] = GetMemberType(cache.memberInfos[i]); } } if (inMemberNames.Length != cache.memberInfos.Length && !bSimpleAssembly) { throw new SerializationException(Environment.GetResourceString("Serialization_WrongNumberOfMembers", objectType, cache.memberInfos.Length, inMemberNames.Length)); } Type[] outMemberTypes = new Type[inMemberNames.Length]; bool isFound = false; for (int i = 0; i < inMemberNames.Length; i++) { if (inMemberNames[i].Equals(cache.memberInfos[i].Name)) { outMemberTypes[i] = cache.memberTypes[i]; } else { // MemberNames on wire in different order then memberInfos returned by reflection isFound = false; for (int j = 0; j < cache.memberInfos.Length; j++) { if (inMemberNames[i].Equals(cache.memberInfos[j].Name)) { outMemberTypes[i] = cache.memberTypes[j]; SerTrace.Log(this, objectInfoId, " ", objectType, " GetMemberTypes memberName ", inMemberNames[i], " ", i, " memberTypes ", outMemberTypes[j], " ", j); isFound = true; break; } } if (!isFound) { throw new SerializationException(String.Format(Environment.GetResourceString("Serialization_Position"), objectType)); } } } return(outMemberTypes); }
private void InitNoMembers() { cache = (SerObjectInfoCache)serObjectInfoInit.seenBeforeTable[objectType]; if (cache == null) { SerTrace.Log(this, objectInfoId, " ", objectType, " InitMemberInfo new cache"); cache = new SerObjectInfoCache(objectType); serObjectInfoInit.seenBeforeTable.Add(objectType, cache); } }
// Returns a COM runtime type associated with the type code internal static Type ToType(InternalPrimitiveTypeE code) { SerTrace.Log("Converter", "ToType Entry ", ((Enum)code).ToString()); if (typeA == null) { InitTypeA(); } SerTrace.Log("Converter", "ToType Exit ", (((object)typeA[(int)code] == null)?"null ":typeA[(int)code].Name)); return(typeA[(int)code]); }
// Fills in the values for an object internal void PopulateObjectMembers(Object obj, Object[] memberData) { SerTrace.Log(this, objectInfoId, " ", objectType, " PopulateObjectMembers isSi ", isSi); if (!isSi && memberData != null) { DumpPopulate(cache.memberInfos, memberData); FormatterServices.PopulateObjectMembers(obj, cache.memberInfos, memberData); } }
// Binary Stream Record Reads internal void ReadSerializationHeaderRecord() { SerTrace.Log(this, "ReadSerializationHeaderRecord"); SerializationHeaderRecord record = new SerializationHeaderRecord(); record.Read(this); record.Dump(); this.topId = (record.topId > 0 ? objectReader.GetId(record.topId) : record.topId); this.headerId = (record.headerId > 0 ? objectReader.GetId(record.headerId) : record.headerId); }
// Write constructor internal void InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter) { SerTrace.Log(this, objectInfoId, " Constructor 1 ", obj); this.context = context; this.obj = obj; this.serObjectInfoInit = serObjectInfoInit; ISurrogateSelector surrogateSelectorTemp; if (RemotingServices.IsTransparentProxy(obj)) { objectType = Converter.typeofMarshalByRefObject; } else { objectType = obj.GetType(); } if (objectType.IsArray) { isArray = true; InitNoMembers(); return; } SerTrace.Log(this, objectInfoId, " Constructor 1 trace 2"); objectWriter.ObjectManager.RegisterObject(obj); if (surrogateSelector != null && (serializationSurrogate = surrogateSelector.GetSurrogate(objectType, context, out surrogateSelectorTemp)) != null) { SerTrace.Log(this, objectInfoId, " Constructor 1 trace 3"); si = new SerializationInfo(objectType, converter); if (!objectType.IsPrimitive) { serializationSurrogate.GetObjectData(obj, si, context); } InitSiWrite(); } else if (obj is ISerializable) { if (!objectType.IsSerializable) { throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Serialization_NonSerType"), objectType.FullName, objectType.Assembly.FullName)); } si = new SerializationInfo(objectType, converter); ((ISerializable)obj).GetObjectData(si, context); SerTrace.Log(this, objectInfoId, " Constructor 1 trace 4 ISerializable " + objectType); InitSiWrite(); } else { SerTrace.Log(this, objectInfoId, " Constructor 1 trace 5"); InitMemberInfo(); } }
// Gets the object on the top of the stack internal Object Peek() { if (top < 0) { return(null); } #if _DEBUG SerTrace.Log(this, "Peek ", stackId, " ", ((objects[top] is ITrace)?((ITrace)objects[top]).Trace():"")); #endif return(objects[top]); }