我會做一個混合。我會使用這樣的對象
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