如何反序列化 GZipStream?
how to deserialize GZipStream?
我正在序列化一个流,它正在使用 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 是 Stream.
这里是 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
}
提前致谢!
如果我没看错你可以这么写
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);
}
}
到 return 函数的结果我们首先从 MemoryStream
类型转换为 object
类型然后我们可以使用从 object
类型到 T
的显式转换类型。
我正在序列化一个流,它正在使用 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 是 Stream.
这里是 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
}
提前致谢!
如果我没看错你可以这么写
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);
}
}
到 return 函数的结果我们首先从 MemoryStream
类型转换为 object
类型然后我们可以使用从 object
类型到 T
的显式转换类型。