我会做一个混合。我会使用这样的对象
public class TransferObject
{
public string Type { get; set; }
public byte[] Data { get; set; }
}
然后我有一个很好的小工具,序列化一个对象,然后压缩它。
public static class CompressedSerializer
{
/// <summary>
/// Decompresses the specified compressed data.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="compressedData">The compressed data.</param>
/// <returns></returns>
public static T Decompress<T>(byte[] compressedData) where T : class
{
T result = null;
using (MemoryStream memory = new MemoryStream())
{
memory.Write(compressedData, 0, compressedData.Length);
memory.Position = 0L;
using (GZipStream zip= new GZipStream(memory, CompressionMode.Decompress, true))
{
zip.Flush();
var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
result = formatter.Deserialize(zip) as T;
}
}
return result;
}
/// <summary>
/// Compresses the specified data.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data">The data.</param>
/// <returns></returns>
public static byte[] Compress<T>(T data)
{
byte[] result = null;
using (MemoryStream memory = new MemoryStream())
{
using (GZipStream zip= new GZipStream(memory, CompressionMode.Compress, true))
{
var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
formatter.Serialize(zip, data);
}
result = memory.ToArray();
}
return result;
}
}
然后,您只需传递将具有类型名称的传输对象。所以,你可以做这样的事情
[WebMethod]
public void ReceiveData(TransferObject data)
{
Type originType = Type.GetType(data.Type);
object item = CompressedSerializer.Decompress<object>(data.Data);
}
现在压缩串行使用泛型,使它强类型的,但你可以做很容易的方法采取的Type对象使用上述originType反序列化,一切都取决于你实现。
希望这给你一些想法。哦,并回答你的其他问题,wsdl.exe不支持重用类型,WCF虽然。
谢谢!在处理zip流之后,我注意到您读取了内存流**之后,我无法进行压缩工作。显然冲洗拉链流是不够的... – dotjoe 2010-02-05 22:15:25