public void WriteObjectWithReferenceId(Stream stream, object obj, ReferenceTypeHandler handler)
        {
            if (this.idByReferences.TryGetValue(obj, out string id))
            {
                stream.WriteString(id);
                return;
            }

            id = Guid.NewGuid().ToString();
            this.idByReferences.Add(obj, id);
            stream.WriteString(id);
            handler.WriteObjectWithoutReference(stream, obj, this);
        }
        public object GetObject(Stream stream, string id, ReferenceTypeHandler handler)
        {
            if (this.referenceByIds.TryGetValue(id, out object reference))
            {
                return(reference);
            }

            object obj = handler.ReadWithoutReference(stream);

            this.referenceByIds.Add(id, obj);
            handler.Fill(stream, obj, this);
            return(obj);
        }