对象序列化与传输的简化方法

在开发过程中,程序员经常需要将对象从服务器发送到客户端。理想的情况是能够获取整个对象,而不仅仅是部分属性。然而,常见的技术如WCF或Web Services虽然提供了一整套工具,如序列化,但它们往往带来过多的开销和复杂性。本文旨在探讨一种简单、快速且通过基本HTTP协议传输对象的方法。

虽然使用WCF或MTOM等技术可以实现对象的传输,但这些方法对于简单的项目来说过于复杂。本文介绍的方法不涉及安全性和互操作性,但这些可以在后期实现。目标是找到一个快速且简单的方法来在服务器上创建对象,将其序列化,然后发送回客户端。

实现方法

ASP.NET页面上,通过查询字符串来确定客户端请求的对象类型,创建对象,将其序列化为二进制数据,并作为二进制附件发送给客户端。客户端使用WebClient类下载该文件,然后反序列化回对象。服务器和客户端共享一个包含公共对象的类库。最初使用XML序列化实现,但发现速度较慢。如果需要互操作性,XML序列化仍然是一个可行的选择。

代码实现

在服务器端,检查客户端请求的对象,并将其序列化为二进制附件返回。以下是C#代码示例:

protected void Page_Load(object sender, EventArgs e) { // 检查客户端请求的对象 if (Request.QueryString["op"] == "getdata") { // 创建示例数据对象的新实例 var data = new SampleData(); data.moreData = 34343; data.otherData = true; data.SomeData = "fewoifjweofjwepo"; // 设置内容类型和头部 Response.ContentType = "application/octet-stream"; Response.AppendHeader("Content-Disposition", "attachment; filename=sampleData.bin"); // 序列化对象并写入响应流 var binaryFormatter = new BinaryFormatter(); binaryFormatter.Serialize(Response.OutputStream, data); // 重要的是要结束响应,否则其他页面内容也会发送给客户端 Response.End(); } }

在客户端,使用查询字符串创建对服务器的请求,并反序列化响应。以下是C#代码示例:

// 创建服务的URL,这可以存储在配置文件中 string url = "http://localhost/BinaryServiceSample/Default.aspx?op=getdata"; // 将数据下载到字节数组 var client = new WebClient(); byte[] result = client.DownloadData(url); // 创建内存流以存储对象 var mem = new MemoryStream(result); var binaryFormatter = new BinaryFormatter(); var data = (SampleData)binaryFormatter.Deserialize(mem); mem.Close(); // 将对象写入控制台 Console.Write(data.ToString()); Console.ReadLine();

注意事项

虽然二进制序列化可能更符合直觉,但它可能在不同平台上不兼容。使用二进制序列化序列化对象比XML序列化快得多。此代码未包含任何错误处理,这是为了保持代码的清晰和简单。可以通过在发送给客户端之前加密字节来增加安全性,但这会使互操作性变得非常困难。

通过压缩字节可以在传输前获得额外的传输速度;ICSharpCode.SharpZipLib.dll可以在内存中压缩字节,它是免费的,但也可以利用.NET Framework实现HTTP压缩并将其嵌入到代码中。有关示例,请查看这篇文章:。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485