Конец Потока, с которым встречаются перед парсингом, был завершен?

Вот версия Generics для массивов:

import java.util.Random;

public class Shuffle<T> {

    private final Random rnd;

    public Shuffle() {
        rnd = new Random();
    }

    /**
     * Fisher–Yates shuffle.
     */
    public void shuffle(T[] ar) {
        for (int i = ar.length - 1; i > 0; i--) {
            int index = rnd.nextInt(i + 1);
            T a = ar[index];
            ar[index] = ar[i];
            ar[i] = a;
        }
    }
}

Учитывая, что ArrayList - это в основном просто массив, может быть целесообразно работать с ArrayList вместо явного массива и использовать Collections.shuffle ( ). Однако тесты производительности не показывают существенной разницы между приведенными выше и Collections.sort ():

Shuffe<Integer>.shuffle(...) performance: 576084 shuffles per second
Collections.shuffle(ArrayList<Integer>) performance: 629400 shuffles per second
MathArrays.shuffle(int[]) performance: 53062 shuffles per second

Реализация Apache Commons MathArrays.shuffle ограничена int [], и, вероятно, к используемому генератору случайных чисел.

41
задан Mister Dev 21 November 2008 в 07:10
поделиться

4 ответа

Попытайтесь установить положение на 0 из Вашего потока и не использовать Ваш объект, но тип объекта.

        BinaryFormatter b = new BinaryFormatter();
        s.Position = 0;
        return (YourObjectType)b.Deserialize(s);
50
ответ дан Patrick Desjardins 23 September 2019 в 15:34
поделиться
s.Position = 0;

Это потому, что вы должны перейти к началу Чтобы начать копирование данных на массиве!

1
ответ дан 6 July 2019 в 13:29
поделиться

Удостоверьтесь сериализация, завершенная, и что тип сериализации соответствует типу десериализации (т.е. удостоверьтесь, что Вы сериализируете с BinaryFormatter, если Вы десериализовываете с одним). Кроме того, удостоверьтесь, что поток Вы сериализировали к действительно законченной сериализации с Потоком. Сброс () или что-то к тому эффекту.

6
ответ дан GWLlosa 23 September 2019 в 15:34
поделиться

Я потратил 5 лошадей и имею конец потоковой ошибки и потерял данные (Не очевидная функция в GzipStream: необходимо использовать базовый поток только после сброса GzipStream).

Полный пример рабочего кода:

using System;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            string large = LargeJsonContent.GetBigObject();
            string base64;

            using (var readStream = new MemoryStream())
            using (var writeStream = new MemoryStream())
            {
                using (GZipStream compressor = new GZipStream(writeStream, CompressionMode.Compress, true)) //pay attention to leaveOpen = true
                {
                    var formatter = new BinaryFormatter();
                    formatter.Serialize(readStream, large);

                    Console.WriteLine($"After binary serialization of JsonString: {readStream.Length} bytes");

                    readStream.Position = 0;
                    readStream.CopyTo(compressor);
                }

                Console.WriteLine($"Compressed stream size: {writeStream.Length} bytes");

                writeStream.Position = 0;
                byte[] writeBytes = writeStream.ToArray();
                base64 = Convert.ToBase64String(writeBytes);
            }


            ////

            using (var stream = new MemoryStream())
            {
                var formatter = new BinaryFormatter();
                formatter.Serialize(stream, base64);
                Console.WriteLine($"Size of base64: {stream.Length} bytes");
            }

            Console.WriteLine("---------------------");
            ////

            string large2;

            var bytes = Convert.FromBase64String(base64);
            using (var readStream = new MemoryStream())
            {
                readStream.Write(bytes, 0, bytes.Length);
                readStream.Position = 0;
                Console.WriteLine($"Compressed stream size: {readStream.Length} bytes");
                using (var writeStream = new MemoryStream())
                {
                    using (GZipStream decompressor = new GZipStream(readStream, CompressionMode.Decompress, true)) //pay attention to leaveOpen = true
                    {
                        decompressor.CopyTo(writeStream);
                        writeStream.Position = 0;
                    }

                    var formatter = new BinaryFormatter();
                    large2 = (string)formatter.Deserialize(writeStream);
                }
            }

            Console.WriteLine(large == large2);
            Console.WriteLine($"large:{large.Length} | large2:{large2.Length}");
        }
    }
}

0
ответ дан 26 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: