// Specifies whether the embedded attribute is set for a member. internal bool IsEmbeddedAttribute(String name) { InternalST.Soap(this, objectInfoId, " ", objectType, " IsEmbedded Entry ", name); if (arrayElemObjectInfo != null) { return(arrayElemObjectInfo.IsEmbeddedAttribute(name)); } bool isEmbedded = false; if (cache.memberAttributeInfos != null && cache.memberAttributeInfos.Length > 0) { SoapAttributeInfo attributeInfo = cache.memberAttributeInfos[Position(name)]; isEmbedded = attributeInfo.IsEmbedded(); } InternalST.Soap(this, objectInfoId, " ", objectType, " IsEmbedded Exit ", isEmbedded); return(isEmbedded); }
// Writes the members of an object private void WriteMembers(NameInfo memberNameInfo, NameInfo memberTypeNameInfo, Object memberData, WriteObjectInfo objectInfo, NameInfo typeNameInfo, WriteObjectInfo memberObjectInfo, bool isAttribute) { InternalST.Soap( this, "WriteMembers Entry memberType: ",memberTypeNameInfo.NIname," memberName: ",memberNameInfo.NIname," data: ",memberData," objectId: ",objectInfo.objectId, " Container object ",objectInfo.obj, " isAttribute ", isAttribute); Type memberType = memberNameInfo.NItype; // Types are transmitted for a member as follows: // The member is of type object // The member object of type is ISerializable and // Soap - the member is a non-primitive value type, or it is a primitive value type which needs types (TimeSpan, DateTime) // TimeSpan and DateTime are transmitted as UInt64 to keep their precision. // Binary - Types always transmitted. if ((memberType == Converter.typeofObject) || (memberType.IsValueType && objectInfo.isSi && Converter.IsSiTransmitType(memberTypeNameInfo.NIprimitiveTypeEnum))) { memberTypeNameInfo.NItransmitTypeOnMember = true; memberNameInfo.NItransmitTypeOnMember = true; } if (CheckTypeFormat(formatterEnums.FEtypeFormat, FormatterTypeStyle.TypesAlways)) { memberTypeNameInfo.NItransmitTypeOnObject = true; memberNameInfo.NItransmitTypeOnObject = true; memberNameInfo.NIisParentTypeOnObject = 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.NIprimitiveTypeEnum == InternalPrimitiveTypeE.Invalid) { if (RemotingServices.IsTransparentProxy(outObj)) outType = Converter.typeofMarshalByRefObject; else { outType = GetType(outObj); if (memberType != outType) { memberTypeNameInfo.NItransmitTypeOnMember = true; memberNameInfo.NItransmitTypeOnMember = true; } } } if (memberType == Converter.typeofObject) { memberType = GetType(memberData); if (memberObjectInfo == null) TypeToNameInfo(memberType, memberTypeNameInfo); else TypeToNameInfo(memberObjectInfo, memberTypeNameInfo); InternalST.Soap( this, "WriteMembers memberType Object, actual memberType ",memberType); } if (memberObjectInfo != null && memberObjectInfo.isArray) { // Array InternalST.Soap( this, "WriteMembers IsArray"); long arrayId = 0; if (!(objectInfo.IsEmbeddedAttribute(memberNameInfo.NIname)|| IsEmbeddedAttribute(memberType))) { arrayId = Schedule(outObj, outType, memberObjectInfo); } if (arrayId > 0) { // Array as object InternalST.Soap( this, "WriteMembers Schedule 3"); memberNameInfo.NIobjectId = arrayId; WriteObjectRef(memberNameInfo, arrayId); } else { // Nested Array serWriter.WriteMemberNested(memberNameInfo); memberObjectInfo.objectId = arrayId; memberNameInfo.NIobjectId = arrayId; memberNameInfo.NIisNestedObject = true; WriteArray(memberObjectInfo, memberNameInfo, memberObjectInfo); } InternalST.Soap( this, "WriteMembers Array Exit "); return; } if (!WriteKnownValueClass(memberNameInfo, memberTypeNameInfo, memberData, isAttribute)) { InternalST.Soap( this, "WriteMembers Object ",memberData); // In soap an enum is written out as a string if (memberTypeNameInfo.NItype.IsEnum) WriteEnum(memberNameInfo, memberTypeNameInfo, memberData, isAttribute); else { if (isAttribute) { // XmlAttribute must be a primitive type or string throw new SerializationException(String.Format(SoapUtil.GetResourceString("Serialization_NonPrimitive_XmlAttribute"), memberNameInfo.NIname)); } // Value or NO_ID, need to explicitly check for IsValue because a top level // value class has an objectId of 1 if ((memberType.IsValueType) || objectInfo.IsEmbeddedAttribute(memberNameInfo.NIname) || IsEmbeddedAttribute(outType)) { InternalST.Soap( this, "WriteMembers Value Type or NO_ID parameter"); serWriter.WriteMemberNested(memberNameInfo); memberObjectInfo.objectId = -1; NameInfo newTypeNameInfo = TypeToNameInfo(memberObjectInfo); newTypeNameInfo.NIobjectId = -1; memberNameInfo.NIisNestedObject = true; if (objectInfo.isSi) { memberTypeNameInfo.NItransmitTypeOnMember = true; memberNameInfo.NItransmitTypeOnMember = true; } Write( memberObjectInfo, memberNameInfo, newTypeNameInfo); PutNameInfo(newTypeNameInfo); memberObjectInfo.ObjectEnd(); } else { InternalST.Soap( this, "WriteMembers Schedule 4"); long memberObjectId = 0; memberObjectId = Schedule(outObj, outType, memberObjectInfo); if (memberObjectId < 0) { // Nested object InternalST.Soap( this, "WriteMembers Nesting"); serWriter.WriteMemberNested(memberNameInfo); memberObjectInfo.objectId = -1; NameInfo newTypeNameInfo = TypeToNameInfo(memberObjectInfo); newTypeNameInfo.NIobjectId = -1; memberNameInfo.NIisNestedObject = true; Write(memberObjectInfo, memberNameInfo, newTypeNameInfo); PutNameInfo(newTypeNameInfo); memberObjectInfo.ObjectEnd(); } else { // Object reference memberNameInfo.NIobjectId = memberObjectId; WriteObjectRef(memberNameInfo, memberObjectId); } } } } InternalST.Soap( this, "WriteMembers Exit "); }
private void WriteMembers(NameInfo memberNameInfo, NameInfo memberTypeNameInfo, object memberData, WriteObjectInfo objectInfo, NameInfo typeNameInfo, WriteObjectInfo memberObjectInfo, bool isAttribute) { Type nItype = memberNameInfo.NItype; if ((nItype == Converter.typeofObject) || ((nItype.IsValueType && objectInfo.isSi) && Converter.IsSiTransmitType(memberTypeNameInfo.NIprimitiveTypeEnum))) { memberTypeNameInfo.NItransmitTypeOnMember = true; memberNameInfo.NItransmitTypeOnMember = true; } if (this.CheckTypeFormat(this.formatterEnums.FEtypeFormat, FormatterTypeStyle.TypesAlways)) { memberTypeNameInfo.NItransmitTypeOnObject = true; memberNameInfo.NItransmitTypeOnObject = true; memberNameInfo.NIisParentTypeOnObject = true; } if (!this.CheckForNull(objectInfo, memberNameInfo, memberTypeNameInfo, memberData)) { object proxy = memberData; Type type = null; if (memberTypeNameInfo.NIprimitiveTypeEnum == InternalPrimitiveTypeE.Invalid) { if (RemotingServices.IsTransparentProxy(proxy)) { type = Converter.typeofMarshalByRefObject; } else { type = this.GetType(proxy); if (nItype != type) { memberTypeNameInfo.NItransmitTypeOnMember = true; memberNameInfo.NItransmitTypeOnMember = true; } } } if (nItype == Converter.typeofObject) { nItype = this.GetType(memberData); if (memberObjectInfo == null) { this.TypeToNameInfo(nItype, memberTypeNameInfo); } else { this.TypeToNameInfo(memberObjectInfo, memberTypeNameInfo); } } if ((memberObjectInfo != null) && memberObjectInfo.isArray) { long objectId = 0L; if (!objectInfo.IsEmbeddedAttribute(memberNameInfo.NIname) && !this.IsEmbeddedAttribute(nItype)) { objectId = this.Schedule(proxy, type, memberObjectInfo); } if (objectId > 0L) { memberNameInfo.NIobjectId = objectId; this.WriteObjectRef(memberNameInfo, memberTypeNameInfo, objectId); } else { this.serWriter.WriteMemberNested(memberNameInfo); memberObjectInfo.objectId = objectId; memberNameInfo.NIobjectId = objectId; memberNameInfo.NIisNestedObject = true; this.WriteArray(memberObjectInfo, memberNameInfo, memberObjectInfo); } } else if (!this.WriteKnownValueClass(memberNameInfo, memberTypeNameInfo, memberData, isAttribute)) { if (memberTypeNameInfo.NItype.IsEnum) { this.WriteEnum(memberNameInfo, memberTypeNameInfo, memberData, isAttribute); } else { if (isAttribute) { throw new SerializationException(string.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_NonPrimitive_XmlAttribute"), new object[] { memberNameInfo.NIname })); } if ((nItype.IsValueType || objectInfo.IsEmbeddedAttribute(memberNameInfo.NIname)) || this.IsEmbeddedAttribute(type)) { this.serWriter.WriteMemberNested(memberNameInfo); memberObjectInfo.objectId = -1L; NameInfo info = this.TypeToNameInfo(memberObjectInfo); info.NIobjectId = -1L; memberNameInfo.NIisNestedObject = true; if (objectInfo.isSi) { memberTypeNameInfo.NItransmitTypeOnMember = true; memberNameInfo.NItransmitTypeOnMember = true; } this.Write(memberObjectInfo, memberNameInfo, info); this.PutNameInfo(info); memberObjectInfo.ObjectEnd(); } else { long num2 = 0L; num2 = this.Schedule(proxy, type, memberObjectInfo); if (num2 < 0L) { this.serWriter.WriteMemberNested(memberNameInfo); memberObjectInfo.objectId = -1L; NameInfo info2 = this.TypeToNameInfo(memberObjectInfo); info2.NIobjectId = -1L; memberNameInfo.NIisNestedObject = true; this.Write(memberObjectInfo, memberNameInfo, info2); this.PutNameInfo(info2); memberObjectInfo.ObjectEnd(); } else { memberNameInfo.NIobjectId = num2; this.WriteObjectRef(memberNameInfo, memberTypeNameInfo, num2); } } } } } }