public static void WriteObject(this Stream stream, object value, Type valueType, ValueSerializer valueSerializer,
bool preserveObjectReferences, SerializerSession session)
{
if (value == null) //value is null
{
NullSerializer.Instance.WriteManifest(stream, null, session);
}
else
{
int existingId;
if (preserveObjectReferences && session.TryGetObjectId(value, out existingId))
{
//write the serializer manifest
ObjectReferenceSerializer.Instance.WriteManifest(stream, null, session);
//write the object reference id
ObjectReferenceSerializer.Instance.WriteValue(stream, existingId, session);
}
else
{
var vType = value.GetType();
var s2 = valueSerializer;
if (vType != valueType)
{
//value is of subtype, lookup the serializer for that type
s2 = session.Serializer.GetSerializerByType(vType);
}
//lookup serializer for subtype
s2.WriteManifest(stream, vType, session);
s2.WriteValue(stream, value, session);
}
}
}