自定义序列化 -第一部分






1.87/5 (5投票s)
在软件世界中,序列化和反序列化非常重要。您应该能够将内存中的数据保存到持久存储中以便以后检索,或者您可能希望与其他软件/框架/系统/平台共享数据。
引言
序列化和反序列化在软件世界中至关重要。您应该能够将内存中的数据保存到持久存储中以便以后检索,或者您可能希望与其他软件/框架/系统/平台共享数据。在本系列文章中,我将带您了解 .NET 世界中序列化的简单到高级功能。
序列化与反序列化
为了建立背景,让我们先定义术语。序列化是将对象转换为字节流的过程,该字节流可以传输到另一个层或系统。反序列化是将字节流转换为本机对象的过程,以便下游业务流程可以使用它。如果您的应用程序涉及需要持久化以供将来使用,或者需要被其他技术(例如 Java 服务)使用的自定义业务实体等,那么在发送之前需要对这些实体进行序列化,并在从外部系统接收后进行反序列化。在 .NET 中,当您创建一个具有公共属性的类时,该类的实例将由 .NET Framework 自动序列化/反序列化。
在本系列文章中,我们将深入探讨序列化,了解它是如何工作的,以及我们如何实现自己的序列化机制。为了建立背景并让大家轻松上手,我将从一个简单的示例开始。我建议参考本文附带的示例代码来完全理解它。
逻辑架构
下图显示了示例应用程序的逻辑架构
该系统由一个业务实体(在本例中为具有四个字段的 `Customer`)和一个业务逻辑层(Customer BLL)组成。两者都构建在单独的程序集中。我有一个 Windows 客户端应用程序,它使用该实体并消耗业务逻辑层。该应用程序只是创建一个客户实体,从控件中填充数据,然后使用业务逻辑层对其进行验证。
进程内模式
直接从 Windows 客户端应用程序使用业务逻辑层并不奇怪。该对象在 Windows 应用程序的进程中创建,驻留在其中,系统能够对其进行消耗和使用。这种情况在 Windows 客户端应用程序的“进程内模式”中有所体现。
跨越边界/跨进程
我还开发了一个 Web 服务项目,该项目封装了业务逻辑层类。该层通过 Web 服务公开 BLL。请记住,BLL 具有接受和返回 `Customer` 作为参数的方法。当我们将它公开为 Web 服务时,类型会作为 WSDL 的一部分被公开。因此,当您查询 WSDL(键入 *websitehomepage/webservicename.asmx?wsdl*)时,您会看到 `Customer` 作为复杂类型,其属性作为定义了类型的元素。
Windows 客户端应用程序有一个名为“使用 Web 服务代理”的另一个组,其中通过 Web 服务代理进行调用。该应用程序运行良好,它能够创建 `Customer` 对象并使用 Web 服务对其进行验证。当数据通过 Web 服务传输时,它们使用 XML 格式。问题在于 `Customer` 对象是如何转换为 XML 的,以及谁来做?我们从未编写过任何代码来将对象转换为 XML 或反之。事实上,这是由 .NET Framework 本身完成的。
框架查看类的公共属性,并使用 `XmlSerializer` 将它们转换为 XML 格式——这称为序列化。
当它被另一个 .NET 应用程序使用时,.NET 框架会自动将 XML 流转换为 .NET 对象——这称为反序列化。这是一个两步过程。当您使用 *WSDL.exe* 或通过 VS 添加 Web 引用选项创建 Web 服务代理时,该工具将生成一个代理类来消耗 Web 服务,并且还会通过查看 WSDL 复杂类型来创建实体类。因此,完成后,您将看到 `CustomerService` 类,它是您的代理类,然后是 `Customer` 类,它是您的实体类。
当您通过 `CustomerService` 代理类调用 Web 服务时,它会接受并返回作为代理类一部分创建的 `Customer` 实例。当您查看生成的 WSDL 代理代码时,这一点就很明显了。请参阅 Web 引用-> CustomerBLLWSServiceProxy 文件夹内的 *Reference.cs*。
代码工作原理
下载包含以下 C# 项目
- BusinessEntities – 包含带有公共字段的 `Customer` 类。
- BusinessLogicLayer – 对业务实体执行业务逻辑。
- BLLWebService – 将业务逻辑层公开为 Web 服务的 Web 服务项目。
- WinClient – 消耗业务逻辑层(进程内场景)和 BLL Web 服务(进程外、跨平台场景)的 Windows Forms 客户端应用程序。进程内模式验证按钮调用业务逻辑层。在这种情况下,不会有序列化或反序列化过程。Web 服务模式验证按钮调用 Web 服务。它首先调用 `NewCustomer()` 方法,获取 `Customer` 实例,填充数据,然后调用 `ValidateCustomer()` Web 服务方法。这次,它传递填充的 `Customer` 实例。它创建的 `Customer` 实例将是代理生成的类,而不是来自 BusinessEntities 程序集的类。
这是一篇关于序列化和反序列化过程的入门文章。在下一篇文章中,我们将深入探讨序列化过程。
阅读愉快,编码愉快!