public void GetWritingStream()
    {
        var fi = "unit".TempFileInfo();

        try {
            byte[] bytes             = "This is just a test".UTF8Bytes();
            FileBackedByteArray fbba = null;
            using (var fs = fi.GetWritingStream(it => fbba = new FileBackedByteArray(it))) {
                Assert.IsNull(fbba);
                fs.WriteBytes(bytes);
                Assert.IsTrue(fi.Exists, "Temp file was not created");
            }
            Assert.IsNotNull(fbba);
            Assert.AreEqual(bytes.Length, fbba.Length);
            Assert.AreEqual(0L, fbba.Offset);
            using (var s = fbba.ReadingStream) {
                var readBytes = s.ReadAllBytesAsync().Result;
                CollectionAssert.AreEqual(bytes, readBytes);
            }
            var prefixedArrayBytes = bytes.Prepend((byte)bytes.Length).Prepend((byte)ILTagId.ByteArray).ToArray();
            using var mso = SerializeInto(fbba, prefixedArrayBytes);
        } finally {
            fi.Delete();
        }
    }
    public void FromPartialFileToStream()
    {
        var fi = "unit".TempFileInfo();

        try {
            var arrayBytes         = new byte[] { 1, 2, 3, 4, 5, 6, 7 };
            int bytesLength        = arrayBytes.Length;
            var prefixedArrayBytes = arrayBytes.Prepend((byte)bytesLength).Prepend((byte)ILTagId.ByteArray).ToArray();
            using (var fos = fi.OpenWrite()) {
                fos.Write(arrayBytes);
                fos.Write(arrayBytes);
            }
            var fbba = new FileBackedByteArray(fi, bytesLength, (ulong)bytesLength);
            Assert.IsNotNull(fbba);
            Assert.AreEqual("FileBackedByteArray#16", fbba.Formatted);
            Assert.AreEqual(bytesLength, fbba.Length);
            Assert.AreEqual(bytesLength, fbba.Offset);
            Assert.AreEqual(ILTagId.ByteArray, fbba.TagId);
            Assert.IsNull(fbba.Value);
            using var mso = SerializeInto(fbba, prefixedArrayBytes);
            mso.Position  = 0;
            var tagArray = TagProvider.DeserializeFrom(mso);
            Assert.IsInstanceOf <ILTagByteArray>(tagArray);
            CollectionAssert.AreEqual(prefixedArrayBytes, tagArray.EncodedBytes);
        } finally {
            fi.Delete();
        }
    }
    private static async Task FromStreamToStreamAsync(Func <FileInfo, MemoryStream, Task <FileBackedByteArray> > createFrom)
    {
        var fi = "unit".TempFileInfo();

        try {
            var arrayBytes         = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            int bytesLength        = arrayBytes.Length;
            var prefixedArrayBytes = arrayBytes.Prepend((byte)bytesLength).Prepend((byte)ILTagId.ByteArray).ToArray();
            using var ms = new MemoryStream(arrayBytes);
            var fbba = await createFrom(fi, ms);

            Assert.IsNotNull(fbba);
            string formatted = fbba.Formatted;
            StringAssert.EndsWith("#16", formatted);
            StringAssert.StartsWith("FileBackedByteArray", formatted);
            Assert.AreEqual(bytesLength, fbba.Length);
            Assert.AreEqual(0, fbba.Offset);
            Assert.AreEqual(ILTagId.ByteArray, fbba.TagId);
            using var mso = SerializeInto(fbba, prefixedArrayBytes);
            mso.Position  = 0;
            var tagArray = TagProvider.DeserializeFrom(mso);
            Assert.IsInstanceOf <ILTagByteArray>(tagArray);
            CollectionAssert.AreEqual(prefixedArrayBytes, tagArray.EncodedBytes);
            var fbba2 = new FileBackedByteArray(fi);
            using (var fs = fbba2.OpenReadingStreamAsync().Result)
                CollectionAssert.AreEqual(prefixedArrayBytes, fs.ReadAllBytesAsync().Result);
            Assert.AreEqual(arrayBytes.Length, fbba2.Length);
            using var s = fbba2.ReadingStream;
            var bytes = s.ReadAllBytesAsync().Result;
            Assert.IsNotNull(bytes);
            CollectionAssert.AreEqual(arrayBytes, bytes);
        } finally {
            fi.Delete();
        }
    }
    private static MemoryStream SerializeInto(FileBackedByteArray fbba, byte[] prefixedArrayBytes)
    {
        var mso = new MemoryStream();

        _ = fbba.SerializeIntoAsync(mso).Result;
        var outputBytes = mso.ToArray();

        Assert.IsNotNull(outputBytes);
        CollectionAssert.AreEqual(prefixedArrayBytes, outputBytes);
        return(mso);
    }