public static void WriteStreamedObject(BinaryWriter writer, IStreamedObject StreamedObject)
        {
            // This version doesn't write a tag before the StreamedObject
            if (StreamedObject == null)
            {
                return;
            }
            WriteValueType(writer, ValueType.StreamedObject);
            var  pos = writer.BaseStream.Position;
            long L   = 0;

            writer.Write(L); // Reserve the place for the size of the block
            StreamedObject.WriteStream(writer, null);
            var pos2 = writer.BaseStream.Position;

            writer.BaseStream.Seek(pos, SeekOrigin.Begin);
            L = pos2 - pos - sizeof(long);
            writer.Write(L);
            writer.BaseStream.Seek(pos2, SeekOrigin.Begin);
        }
        public static void WriteStreamedObject(BinaryWriter writer, IStreamedObject StreamedObject, Tags tag,
                                               object options)
        {
            if (StreamedObject == null)
            {
                return;
            }
            WriteTag(writer, tag);
            WriteValueType(writer, ValueType.StreamedObject);
            var  pos = writer.BaseStream.Position;
            long L   = 0;

            writer.Write(L); // Reserve the place for the size of the block
            StreamedObject.WriteStream(writer, options);
            var pos2 = writer.BaseStream.Position;

            writer.BaseStream.Seek(pos, SeekOrigin.Begin);
            L = pos2 - pos - sizeof(long);
            writer.Write(L);
            writer.BaseStream.Seek(pos2, SeekOrigin.Begin);
        }
        public static void WriteTypedStreamedObject(BinaryWriter writer, IStreamedObject StreamedObject, Tags tag,
                                                    object options)
        {
            if (StreamedObject == null)
            {
                return;
            }
            WriteTag(writer, tag);
            WriteValueType(writer, ValueType.TypedStreamedObject);
            var  pos = writer.BaseStream.Position;
            long L   = 0;

            writer.Write(L); // Reserve the place for the size of the block
            // First write the type of the object - later on it'll be used to recreate the object
            WriteType(writer, StreamedObject.GetType());
            StreamedObject.WriteStream(writer, options);
            var pos2 = writer.BaseStream.Position;

            writer.BaseStream.Seek(pos, SeekOrigin.Begin);
            L = pos2 - pos - sizeof(long);
            writer.Write(L);
            writer.BaseStream.Seek(pos2, SeekOrigin.Begin);
        }