ハイブリッドをやります。私はこのようなオブジェクトを使用します
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);
}
現在、圧縮シリアライザーはジェネリックスを使用して厳密に型指定されていますが、上記のoriginTypeを使用して、Typeオブジェクトを簡単に取り込んで逆シリアル化するメソッドを作成できます。これは、すべて実装によって異なります。
これがあなたにいくつかのアイデアを与えることを願っています。ああ、そしてあなたの他の質問に答えるために、wsdl.exeは型の再利用をサポートしていませんが、WCFはサポートしています。