示例#1
0
        private void WriteObject(BinaryWriter writer, long id, object obj)
        {
            TypeMetadata typeMetadata;
            object       data;

            this.GetObjectData(obj, out typeMetadata, out data);
            ObjectWriter.MetadataReference metadataReference = (ObjectWriter.MetadataReference) this._cachedMetadata[typeMetadata.InstanceTypeName];
            if (metadataReference != null && typeMetadata.IsCompatible(metadataReference.Metadata))
            {
                writer.Write(1);
                writer.Write((int)id);
                writer.Write((int)metadataReference.ObjectID);
                typeMetadata.WriteObjectData(this, writer, data);
                return;
            }
            if (metadataReference == null)
            {
                metadataReference = new ObjectWriter.MetadataReference(typeMetadata, id);
                this._cachedMetadata[typeMetadata.InstanceTypeName] = metadataReference;
            }
            bool          flag = typeMetadata.RequiresTypes || this._typeFormat == FormatterTypeStyle.TypesAlways;
            BinaryElement value;
            int           num;

            if (typeMetadata.TypeAssemblyName == ObjectWriter.CorlibAssemblyName)
            {
                value = ((!flag) ? BinaryElement.UntypedRuntimeObject : BinaryElement.RuntimeObject);
                num   = -1;
            }
            else
            {
                value = ((!flag) ? BinaryElement.UntypedExternalObject : BinaryElement.ExternalObject);
                num   = this.WriteAssemblyName(writer, typeMetadata.TypeAssemblyName);
            }
            typeMetadata.WriteAssemblies(this, writer);
            writer.Write((byte)value);
            writer.Write((int)id);
            writer.Write(typeMetadata.InstanceTypeName);
            typeMetadata.WriteTypeData(this, writer, flag);
            if (num != -1)
            {
                writer.Write(num);
            }
            typeMetadata.WriteObjectData(this, writer, data);
        }