// Writes the members of an object private void WriteMembers(NameInfo memberNameInfo, NameInfo memberTypeNameInfo, object memberData, WriteObjectInfo objectInfo, NameInfo typeNameInfo, WriteObjectInfo memberObjectInfo) { Type memberType = memberNameInfo._type; bool assignUniqueIdToValueType = false; // Types are transmitted for a member as follows: // The member is of type object // The member object of type is ISerializable and // Binary - Types always transmitted. if (ReferenceEquals(memberType, Converter.s_typeofObject) || Nullable.GetUnderlyingType(memberType) != null) { memberTypeNameInfo._transmitTypeOnMember = true; memberNameInfo._transmitTypeOnMember = true; } if (CheckTypeFormat(_formatterEnums._typeFormat, FormatterTypeStyle.TypesAlways) || (objectInfo._isSi)) { memberTypeNameInfo._transmitTypeOnObject = true; memberNameInfo._transmitTypeOnObject = true; memberNameInfo._isParentTypeOnObject = true; } if (CheckForNull(objectInfo, memberNameInfo, memberTypeNameInfo, memberData)) { return; } object outObj = memberData; Type outType = null; // If member type does not equal data type, transmit type on object. if (memberTypeNameInfo._primitiveTypeEnum == InternalPrimitiveTypeE.Invalid) { outType = GetType(outObj); if (!ReferenceEquals(memberType, outType)) { memberTypeNameInfo._transmitTypeOnMember = true; memberNameInfo._transmitTypeOnMember = true; } } if (ReferenceEquals(memberType, Converter.s_typeofObject)) { assignUniqueIdToValueType = true; memberType = GetType(memberData); if (memberObjectInfo == null) { TypeToNameInfo(memberType, memberTypeNameInfo); } else { TypeToNameInfo(memberObjectInfo, memberTypeNameInfo); } } if (memberObjectInfo != null && memberObjectInfo._isArray) { // Array long arrayId = 0; if (outType == null) { outType = GetType(outObj); } // outObj is an array. It can never be a value type.. arrayId = Schedule(outObj, false, null, memberObjectInfo); if (arrayId > 0) { // Array as object memberNameInfo._objectId = arrayId; WriteObjectRef(memberNameInfo, arrayId); } else { // Nested Array _serWriter.WriteMemberNested(memberNameInfo); memberObjectInfo._objectId = arrayId; memberNameInfo._objectId = arrayId; WriteArray(memberObjectInfo, memberNameInfo, memberObjectInfo); objectInfo.ObjectEnd(); } return; } if (!WriteKnownValueClass(memberNameInfo, memberTypeNameInfo, memberData)) { if (outType == null) { outType = GetType(outObj); } long memberObjectId = Schedule(outObj, assignUniqueIdToValueType, outType, memberObjectInfo); if (memberObjectId < 0) { // Nested object memberObjectInfo._objectId = memberObjectId; NameInfo newTypeNameInfo = TypeToNameInfo(memberObjectInfo); newTypeNameInfo._objectId = memberObjectId; Write(memberObjectInfo, memberNameInfo, newTypeNameInfo); PutNameInfo(newTypeNameInfo); memberObjectInfo.ObjectEnd(); } else { // Object reference memberNameInfo._objectId = memberObjectId; WriteObjectRef(memberNameInfo, memberObjectId); } } }