как десериализовать GZipStream? - PullRequest
0 голосов
/ 04 мая 2018

Я сериализую поток, который хранится в облаке с использованием сервисов REST. Часть сериализации приведена ниже -

public void serialize(Object obj, Stream str)
    {
        using (GZipStream zipStream = new GZipStream(str, CompressionMode.Compress, true))
        {
            if (obj is Stream)//This is executed in my case
            {
                ((Stream)obj).CopyTo(zipStream);
            }
            else
            {
                binarySerializer.serialize(obj, zipStream);
            }
        }
    }

Аргумент obj - это содержимое потока, а str - это пустой поток, в котором хранится сериализованный поток для дальнейшего использования. Если условие выполнено в моем случае, поскольку obj является потоком.

вот код binarySerializer.Serialize () -

public void serialize(object obj, Stream str)
    {
        if (obj is Stream)
        {
            ((Stream)obj).CopyTo(str);
        }
        else
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(str, obj);
        }
    }

Это прекрасно работает, и я могу загрузить сериализованный файл (который отображается в виде двоичного файла с возможностью загрузки) из облака, используя Restlet Client расширение chrome.

Может кто-нибудь помочь мне в написании части Десериализация ? Я хочу код десериализации с подписью ниже -

public T deserialize<T>(Stream str)
    {
      //Code here
    }

Заранее спасибо!

1 Ответ

0 голосов
/ 04 мая 2018

Если я вас правильно понимаю, вы можете написать так

    public T deserialize<T>(Stream str) where T : class, new()
    {
        Type type = typeof(T);
        if (type == typeof(Stream))
        {
            using (var bigStr = new GZipStream(str, CompressionMode.Decompress))
            using (var outStream = new MemoryStream())
            {
                bigStr.CopyTo(outStream);
                return outStream as T;
            }
        }
        else
        {
            BinaryFormatter bin = new BinaryFormatter();
            return (T)bin.Deserialize(str);
        }
    }

Если T является типом Stream, мы десериализуем GZipStream до Stream. В других случаях мы используем простой BinaryFormatter.

После заметок в комментарии

public T Deserialize<T>(Stream str)
    {
        Type type = typeof(T);
        if (type == typeof(Stream))
        {
            using (var bigStr = new GZipStream(str, CompressionMode.Decompress))
            using (var outStream = new MemoryStream())
            {
                bigStr.CopyTo(outStream);
                return (T)(outStream as object);
            }
        }
        else
        {
            BinaryFormatter bin = new BinaryFormatter();
            return (T)bin.Deserialize(str);
        }
    }

Чтобы вернуть результат из функции, мы сначала конвертируем из типа MemoryStream в тип object, затем мы можем использовать явное преобразование из типа object в тип T.

...