// Writes a given object to the stream. private void Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo) { object obj = objectInfo._obj; if (obj == null) { throw new ArgumentNullException(nameof(objectInfo) + "." + nameof(objectInfo._obj)); } Type objType = objectInfo._objectType; long objectId = objectInfo._objectId; if (ReferenceEquals(objType, Converter.s_typeofString)) { // Top level String memberNameInfo._objectId = objectId; _serWriter.WriteObjectString((int)objectId, obj.ToString()); } else { if (objectInfo._isArray) { WriteArray(objectInfo, memberNameInfo, null); } else { string[] memberNames; Type[] memberTypes; object[] memberData; objectInfo.GetMemberInfo(out memberNames, out memberTypes, out memberData); // Only Binary needs to transmit types for ISerializable because the binary formatter transmits the types in URT format. // Soap transmits all types as strings, so it is up to the ISerializable object to convert the string back to its URT type if (objectInfo._isSi || CheckTypeFormat(_formatterEnums._typeFormat, FormatterTypeStyle.TypesAlways)) { memberNameInfo._transmitTypeOnObject = true; memberNameInfo._isParentTypeOnObject = true; typeNameInfo._transmitTypeOnObject = true; typeNameInfo._isParentTypeOnObject = true; } var memberObjectInfos = new WriteObjectInfo[memberNames.Length]; // Get assembly information // Binary Serializer, assembly names need to be // written before objects are referenced. // GetAssemId here will write out the // assemblyStrings at the right Binary // Serialization object boundary. for (int i = 0; i < memberTypes.Length; i++) { Type type = memberTypes[i] != null ? memberTypes[i] : memberData[i] != null?GetType(memberData[i]) : Converter.s_typeofObject; InternalPrimitiveTypeE code = ToCode(type); if ((code == InternalPrimitiveTypeE.Invalid) && (!ReferenceEquals(type, Converter.s_typeofString))) { if (memberData[i] != null) { memberObjectInfos[i] = WriteObjectInfo.Serialize( memberData[i], _surrogates, _context, _serObjectInfoInit, _formatterConverter, this, _binder); memberObjectInfos[i]._assemId = GetAssemblyId(memberObjectInfos[i]); } else { memberObjectInfos[i] = WriteObjectInfo.Serialize( memberTypes[i], _surrogates, _context, _serObjectInfoInit, _formatterConverter, _binder); memberObjectInfos[i]._assemId = GetAssemblyId(memberObjectInfos[i]); } } } Write(objectInfo, memberNameInfo, typeNameInfo, memberNames, memberTypes, memberData, memberObjectInfos); } } }