ObjectEnd() private method

private ObjectEnd ( ) : void
return void
Example #1
0
        // 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);
                     }
                 }
             }
         }
     }
 }