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); }